diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 20812d6f..c3cdf6f5 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -39,4 +39,5 @@ jobs: files: | ./debian-artifact/goxlr-utility_${{ needs.get_version.outputs.version }}_amd64.deb ./rpm-artifact/goxlr-utility-${{ needs.get_version.outputs.version }}-1.x86_64.rpm + ./rpm-artifact/goxlr-utility-${{ needs.get_version.outputs.version }}-suse.x86_64.rpm ./windows-artifact/goxlr-utility-${{ needs.get_version.outputs.version }}.exe diff --git a/Cargo.lock b/Cargo.lock index 4da5bede..a3f1c0e7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10,13 +10,14 @@ checksum = "c71b1793ee61086797f5c80b6efa2b8ffa6d5dd703f118545808a7f2e27f7046" [[package]] name = "actix" -version = "0.13.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f728064aca1c318585bf4bb04ffcfac9e75e508ab4e8b1bd9ba5dfe04e2cbed5" +checksum = "cba56612922b907719d4a01cf11c8d5b458e7d3dba946d0435f20f58d6795ed2" dependencies = [ + "actix-macros", "actix-rt", "actix_derive", - "bitflags 1.3.2", + "bitflags 2.4.1", "bytes", "crossbeam-channel", "futures-core", @@ -66,17 +67,17 @@ dependencies = [ [[package]] name = "actix-http" -version = "3.3.1" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2079246596c18b4a33e274ae10c0e50613f4d32a4198e09c7b93771013fed74" +checksum = "a92ef85799cba03f76e4f7c10f533e66d87c9a7e7055f3391f09000ad8351bc9" dependencies = [ "actix-codec", "actix-rt", "actix-service", "actix-utils", - "ahash 0.8.3", + "ahash 0.8.6", "base64", - "bitflags 1.3.2", + "bitflags 2.4.1", "brotli", "bytes", "bytestring", @@ -84,7 +85,6 @@ dependencies = [ "encoding_rs", "flate2", "futures-core", - "h2", "http", "httparse", "httpdate", @@ -109,7 +109,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" dependencies = [ "quote", - "syn 2.0.27", + "syn 2.0.38", ] [[package]] @@ -127,9 +127,9 @@ dependencies = [ [[package]] name = "actix-rt" -version = "2.8.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15265b6b8e2347670eb363c47fc8c75208b4a4994b27192f345fcbe707804f3e" +checksum = "28f32d40287d3f402ae0028a9d54bef51af15c8769492826a69d28f81893151d" dependencies = [ "futures-core", "tokio", @@ -137,9 +137,9 @@ dependencies = [ [[package]] name = "actix-server" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e8613a75dd50cc45f473cee3c34d59ed677c0f7b44480ce3b8247d7dc519327" +checksum = "3eb13e7eef0423ea6eab0e59f6c72e7cb46d33691ad56a726b3cd07ddec2c2d4" dependencies = [ "actix-rt", "actix-service", @@ -147,8 +147,7 @@ dependencies = [ "futures-core", "futures-util", "mio", - "num_cpus", - "socket2", + "socket2 0.5.5", "tokio", "tracing", ] @@ -176,9 +175,9 @@ dependencies = [ [[package]] name = "actix-web" -version = "4.3.1" +version = "4.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd3cb42f9566ab176e1ef0b8b3a896529062b4efc6be0123046095914c4c1c96" +checksum = "0e4a5b5e29603ca8c94a77c65cf874718ceb60292c5a5c3e5f4ace041af462b9" dependencies = [ "actix-codec", "actix-http", @@ -189,7 +188,7 @@ dependencies = [ "actix-service", "actix-utils", "actix-web-codegen", - "ahash 0.7.6", + "ahash 0.8.6", "bytes", "bytestring", "cfg-if", @@ -197,7 +196,6 @@ dependencies = [ "encoding_rs", "futures-core", "futures-util", - "http", "itoa", "language-tags", "log", @@ -209,7 +207,7 @@ dependencies = [ "serde_json", "serde_urlencoded", "smallvec", - "socket2", + "socket2 0.5.5", "time", "url", ] @@ -234,32 +232,32 @@ dependencies = [ [[package]] name = "actix-web-codegen" -version = "4.2.0" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2262160a7ae29e3415554a3f1fc04c764b1540c116aa524683208078b7a75bc9" +checksum = "eb1f50ebbb30eca122b188319a4398b3f7bb4a8cdf50ecfb73bfc6a3c3ce54f5" dependencies = [ "actix-router", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.38", ] [[package]] name = "actix_derive" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d44b8fee1ced9671ba043476deddef739dd0959bf77030b26b738cc591737a7" +checksum = "7c7db3d5a9718568e4cf4a537cfd7070e6e6ff7481510d0237fb529ac850f6d3" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.38", ] [[package]] name = "addr2line" -version = "0.20.0" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" dependencies = [ "gimli", ] @@ -272,9 +270,9 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "ahash" -version = "0.7.6" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" +checksum = "5a824f2aa7e75a0c98c5a504fceb80649e9c35265d44525b5f94de4771a395cd" dependencies = [ "getrandom 0.2.10", "once_cell", @@ -283,21 +281,22 @@ dependencies = [ [[package]] name = "ahash" -version = "0.8.3" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" +checksum = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a" dependencies = [ "cfg-if", "getrandom 0.2.10", "once_cell", "version_check", + "zerocopy", ] [[package]] name = "aho-corasick" -version = "1.0.2" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" +checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" dependencies = [ "memchr", ] @@ -319,9 +318,9 @@ dependencies = [ [[package]] name = "alsa" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8512c9117059663fb5606788fbca3619e2a91dac0e3fe516242eab1fa6be5e44" +checksum = "e2562ad8dcf0f789f65c6fdaad8a8a9708ed6b488e649da28c01656ad66b8b47" dependencies = [ "alsa-sys", "bitflags 1.3.2", @@ -365,30 +364,29 @@ dependencies = [ [[package]] name = "anstream" -version = "0.3.2" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ca84f3628370c59db74ee214b3263d58f9aadd9b4fe7e711fd87dc452b7f163" +checksum = "2ab91ebe16eb252986481c5b62f6098f3b698a45e34b5b98200cf20dd2484a44" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", - "is-terminal", "utf8parse", ] [[package]] name = "anstyle" -version = "1.0.1" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a30da5c5f2d5e72842e00bcb57657162cdabef0931f40e2deb9b4140440cecd" +checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" [[package]] name = "anstyle-parse" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "938874ff5980b03a87c5524b3ae5b59cf99b1d6bc836848df7bc5ada9643c333" +checksum = "317b9a89c1868f5ea6ff1d9539a69f45dffc21ce321ac1fd1160dfa48c8e2140" dependencies = [ "utf8parse", ] @@ -404,9 +402,9 @@ dependencies = [ [[package]] name = "anstyle-wincon" -version = "1.0.1" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "180abfa45703aebe0093f79badacc01b8fd4ea2e35118747e5811127f926e188" +checksum = "f0699d10d2f4d628a98ee7b57b289abbc98ff3bad977cb3152709d4bf2330628" dependencies = [ "anstyle", "windows-sys 0.48.0", @@ -414,9 +412,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.72" +version = "1.0.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b13c32d80ecc7ab747b80c3784bce54ee8a7a0cc4fbda9bf4cda2cf6fe90854" +checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" [[package]] name = "approx" @@ -446,28 +444,28 @@ dependencies = [ [[package]] name = "async-lock" -version = "2.7.0" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa24f727524730b077666307f2734b4a1a1c57acb79193127dcc8914d5242dd7" +checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b" dependencies = [ "event-listener", ] [[package]] name = "async-task" -version = "4.4.0" +version = "4.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc7ab41815b3c653ccd2978ec3255c81349336702dfdf62ee6f7069b12a3aae" +checksum = "b4eb2cdb97421e01129ccb49169d8279ed21e829929144f4a22a6e54ac549ca1" [[package]] name = "async-trait" -version = "0.1.72" +version = "0.1.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc6dde6e4ed435a4c1ee4e73592f5ba9da2151af10076cc04858746af9352d09" +checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.38", ] [[package]] @@ -496,9 +494,9 @@ dependencies = [ [[package]] name = "atomic-waker" -version = "1.1.1" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1181e1e0d1fce796a03db1ae795d67167da795f9cf4a39c37589e85ef57f26d3" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "atty" @@ -519,9 +517,9 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "backtrace" -version = "0.3.68" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4319208da049c43661739c5fade2ba182f09d1dc2299b32298d3a31692b17e12" +checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" dependencies = [ "addr2line", "cc", @@ -534,9 +532,9 @@ dependencies = [ [[package]] name = "base64" -version = "0.21.2" +version = "0.21.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" +checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" [[package]] name = "bincode" @@ -549,31 +547,11 @@ dependencies = [ [[package]] name = "bindgen" -version = "0.64.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4243e6031260db77ede97ad86c27e501d646a27ab57b59a574f725d98ab1fb4" -dependencies = [ - "bitflags 1.3.2", - "cexpr", - "clang-sys", - "lazy_static", - "lazycell", - "peeking_take_while", - "proc-macro2", - "quote", - "regex", - "rustc-hash", - "shlex", - "syn 1.0.109", -] - -[[package]] -name = "bindgen" -version = "0.66.1" +version = "0.68.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2b84e06fc203107bfbad243f4aba2af864eb7db3b1cf46ea0a023b0b433d2a7" +checksum = "726e4313eb6ec35d2730258ad4e15b547ee75d6afaa1361a922e78e59b7d8078" dependencies = [ - "bitflags 2.3.3", + "bitflags 2.4.1", "cexpr", "clang-sys", "lazy_static", @@ -586,7 +564,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn 2.0.27", + "syn 2.0.38", "which", ] @@ -619,9 +597,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.3.3" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630be753d4e58660abd17930c71b647fe46c27ea6b63cc59e1e3851406972e42" +checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" [[package]] name = "block" @@ -640,17 +618,18 @@ dependencies = [ [[package]] name = "blocking" -version = "1.3.1" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77231a1c8f801696fc0123ec6150ce92cffb8e164a02afb9c8ddee0e9b65ad65" +checksum = "8c36a4d0d48574b3dd360b4b7d95cc651d2b6557b6402848a27d4b228a473e2a" dependencies = [ "async-channel", "async-lock", "async-task", - "atomic-waker", "fastrand", + "futures-io", "futures-lite", - "log", + "piper", + "tracing", ] [[package]] @@ -661,9 +640,9 @@ checksum = "2225b558afc76c596898f5f1b3fc35cfce0eb1b13635cbd7d1b2a7177dc10ccd" [[package]] name = "brotli" -version = "3.3.4" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1a0b1dbcc8ae29329621f8d4f0d835787c1c38bb1401979b49d13b0b305ff68" +checksum = "516074a47ef4bce09577a3b379392300159ce5b1ba2e501ff1c819950066100f" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -672,9 +651,9 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "2.3.4" +version = "2.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b6561fd3f895a11e8f72af2cb7d22e08366bebc2b6b57f7744c4bda27034744" +checksum = "4e2e4afe60d7dd600fdd3de8d0f08c2b7ec039712e3b6137ff98b7004e82de4f" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -682,9 +661,9 @@ dependencies = [ [[package]] name = "bstr" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6798148dccfbff0fae41c7574d2fa8f1ef3492fba0face179de5d8d447d67b05" +checksum = "c79ad7fb2dd38f3dabd76b09c6a5a20c038fc0213ef1e9afd30eb777f120f019" dependencies = [ "memchr", "regex-automata", @@ -693,27 +672,27 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.13.0" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" +checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" [[package]] name = "bytemuck" -version = "1.13.1" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17febce684fd15d89027105661fec94afb475cb995fbc59d2865198446ba2eea" +checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6" [[package]] name = "byteorder" -version = "1.4.3" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" +checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" [[package]] name = "bytestring" @@ -750,11 +729,12 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.79" +version = "1.0.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" dependencies = [ "jobserver", + "libc", ] [[package]] @@ -774,9 +754,9 @@ dependencies = [ [[package]] name = "cfg-expr" -version = "0.15.3" +version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "215c0072ecc28f92eeb0eea38ba63ddfcb65c2828c46311d646f1a3ff5f9841c" +checksum = "03915af431787e6ffdcc74c645077518c6b6e01f80b761e0fbbfa288536311b3" dependencies = [ "smallvec", "target-lexicon", @@ -790,14 +770,14 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.26" +version = "0.4.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec837a71355b28f6556dbd569b37b3f363091c0bd4b2e735674521b4c5fd9bc5" +checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" dependencies = [ "android-tzdata", "iana-time-zone", "num-traits", - "winapi", + "windows-targets 0.48.5", ] [[package]] @@ -828,20 +808,19 @@ dependencies = [ [[package]] name = "clap" -version = "4.3.19" +version = "4.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fd304a20bff958a57f04c4e96a2e7594cc4490a0e809cbd48bb6437edaa452d" +checksum = "ac495e00dcec98c83465d5ad66c5c4fabd652fd6686e7c6269b117e729a6f17b" dependencies = [ "clap_builder", "clap_derive", - "once_cell", ] [[package]] name = "clap_builder" -version = "4.3.19" +version = "4.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01c6a3f08f1fe5662a35cfe393aec09c4df95f60ee93b7556505260f75eee9e1" +checksum = "c77ed9a32a62e6ca27175d00d29d05ca32e396ea1eb5fb01d8256b669cec7663" dependencies = [ "anstream", "anstyle", @@ -851,30 +830,30 @@ dependencies = [ [[package]] name = "clap_complete" -version = "4.3.2" +version = "4.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fc443334c81a804575546c5a8a79b4913b50e28d69232903604cada1de817ce" +checksum = "bffe91f06a11b4b9420f62103854e90867812cd5d01557f853c5ee8e791b12ae" dependencies = [ - "clap 4.3.19", + "clap 4.4.7", ] [[package]] name = "clap_derive" -version = "4.3.12" +version = "4.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54a9bb5758fc5dfe728d1019941681eccaf0cf8a4189b692a0ee2f2ecf90a050" +checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442" dependencies = [ "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.38", ] [[package]] name = "clap_lex" -version = "0.5.0" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2da6da31387c7e4ef160ffab6d5e7f00c42626fe39aea70a7b0f1773f7dd6c1b" +checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" [[package]] name = "cocoa" @@ -894,15 +873,14 @@ dependencies = [ [[package]] name = "cocoa-foundation" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "931d3837c286f56e3c58423ce4eba12d08db2374461a785c86f672b08b5650d6" +checksum = "8c6234cbb2e4c785b456c0644748b1ac416dd045799740356f8363dfe00c93f7" dependencies = [ "bitflags 1.3.2", "block", "core-foundation", "core-graphics-types", - "foreign-types", "libc", "objc", ] @@ -937,9 +915,9 @@ checksum = "7439becb5fafc780b6f4de382b1a7a3e70234afe783854a4702ee8adbb838609" [[package]] name = "concurrent-queue" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62ec6771ecfa0762d24683ee5a32ad78487a3d3afdc0fb8cae19d2c5deb50b7c" +checksum = "f057a694a54f12365049b0958a1685bb52d567f5593b355fbf685838e873d400" dependencies = [ "crossbeam-utils", ] @@ -965,16 +943,10 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" dependencies = [ - "core-foundation-sys 0.8.4", + "core-foundation-sys", "libc", ] -[[package]] -name = "core-foundation-sys" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7ca8a5221364ef15ce201e8ed2f609fc312682a8f4e0e3d4aa5879764e0fa3b" - [[package]] name = "core-foundation-sys" version = "0.8.4" @@ -1007,22 +979,22 @@ dependencies = [ [[package]] name = "coreaudio-rs" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb17e2d1795b1996419648915df94bc7103c28f7b48062d7acf4652fc371b2ff" +checksum = "321077172d79c662f64f5071a03120748d5bb652f5231570141be24cfcd2bace" dependencies = [ "bitflags 1.3.2", - "core-foundation-sys 0.6.2", + "core-foundation-sys", "coreaudio-sys", ] [[package]] name = "coreaudio-sys" -version = "0.2.12" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f034b2258e6c4ade2f73bf87b21047567fb913ee9550837c2316d139b0262b24" +checksum = "d8478e5bdad14dce236b9898ea002eabfa87cbe14f0aa538dbe3b6a4bec4332d" dependencies = [ - "bindgen 0.64.0", + "bindgen", ] [[package]] @@ -1032,7 +1004,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d959d90e938c5493000514b446987c07aed46c668faaa7d34d6c7a67b1a578c" dependencies = [ "alsa", - "core-foundation-sys 0.8.4", + "core-foundation-sys", "coreaudio-rs", "dasp_sample", "jni 0.19.0", @@ -1052,9 +1024,9 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.9" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" +checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0" dependencies = [ "libc", ] @@ -1177,7 +1149,7 @@ dependencies = [ "ident_case", "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.38", ] [[package]] @@ -1199,7 +1171,7 @@ checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" dependencies = [ "darling_core 0.20.3", "quote", - "syn 2.0.27", + "syn 2.0.38", ] [[package]] @@ -1248,6 +1220,15 @@ dependencies = [ "dbus", ] +[[package]] +name = "deranged" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f32d04922c60427da6f9fef14d042d9edddef64cb9d4ce0d64d0685fbeb1fd3" +dependencies = [ + "powerfmt", +] + [[package]] name = "derivative" version = "2.2.0" @@ -1364,9 +1345,9 @@ dependencies = [ [[package]] name = "dyn-clone" -version = "1.0.12" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "304e6508efa593091e97a9abbc10f90aa7ca635b6d2784feff3c89d41dd12272" +checksum = "23d2f3407d9a573d666de4b5bdf10569d73ca9478087346697dcbae6244bfbcd" [[package]] name = "ebur128" @@ -1382,9 +1363,9 @@ dependencies = [ [[package]] name = "educe" -version = "0.4.22" +version = "0.4.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "079044df30bb07de7d846d41a184c4b00e66ebdac93ee459253474f3a47e50ae" +checksum = "0f0042ff8246a363dbe77d2ceedb073339e85a804b9a47636c6e016a9a32c05f" dependencies = [ "enum-ordinalize", "proc-macro2", @@ -1400,20 +1381,20 @@ checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" [[package]] name = "encoding_rs" -version = "0.8.32" +version = "0.8.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394" +checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" dependencies = [ "cfg-if", ] [[package]] name = "enum-map" -version = "2.6.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "017b207acb4cc917f4c31758ed95c0bc63ddb0f358b22eb38f80a2b2a43f6b1f" +checksum = "53337c2dbf26a3c31eccc73a37b10c1614e8d4ae99b6a50d553e8936423c1f16" dependencies = [ - "enum-map-derive 0.12.0", + "enum-map-derive 0.14.0", "serde", ] @@ -1430,33 +1411,33 @@ dependencies = [ [[package]] name = "enum-map-derive" -version = "0.12.0" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8560b409800a72d2d7860f8e5f4e0b0bd22bea6a352ea2a9ce30ccdef7f16d2f" +checksum = "04d0b288e3bb1d861c4403c1774a6f7a798781dfc519b3647df2a3dd4ae95f25" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.38", ] [[package]] name = "enum-ordinalize" -version = "3.1.13" +version = "3.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4f76552f53cefc9a7f64987c3701b99d982f7690606fd67de1d09712fbf52f1" +checksum = "1bf1fa3f06bbff1ea5b1a9c7b14aa992a39657db60a2759457328d7e058f49ee" dependencies = [ "num-bigint", "num-traits", "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.38", ] [[package]] name = "enumset" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e875f1719c16de097dee81ed675e2d9bb63096823ed3f0ca827b7dea3028bbbb" +checksum = "226c0da7462c13fb57e5cc9e0dc8f0635e7d27f276a3a7fd30054647f669007d" dependencies = [ "enumset_derive", "serde", @@ -1471,7 +1452,7 @@ dependencies = [ "darling 0.20.3", "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.38", ] [[package]] @@ -1482,25 +1463,14 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.1" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" +checksum = "ac3e13f66a2f95e32a39eaa81f6b95d42878ca0e1db0c7543723dfe12557e860" dependencies = [ - "errno-dragonfly", "libc", "windows-sys 0.48.0", ] -[[package]] -name = "errno-dragonfly" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" -dependencies = [ - "cc", - "libc", -] - [[package]] name = "event-listener" version = "2.5.3" @@ -1509,9 +1479,9 @@ checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" [[package]] name = "exr" -version = "1.7.0" +version = "1.71.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1e481eb11a482815d3e9d618db8c42a93207134662873809335a92327440c18" +checksum = "832a761f35ab3e6664babfbdc6cef35a4860e816ec3916dcfd0882954e98a8a8" dependencies = [ "bit_field", "flume", @@ -1535,12 +1505,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "1.9.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" -dependencies = [ - "instant", -] +checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" [[package]] name = "fdeflate" @@ -1573,13 +1540,13 @@ dependencies = [ [[package]] name = "filetime" -version = "0.2.21" +version = "0.2.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cbc844cecaee9d4443931972e1289c8ff485cb4cc2767cb03ca139ed6885153" +checksum = "d4029edd3e734da6fe05b6cd7bd2960760a616bd2ddd0d59a0124746d6272af0" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.2.16", + "redox_syscall 0.3.5", "windows-sys 0.48.0", ] @@ -1596,9 +1563,9 @@ dependencies = [ [[package]] name = "flate2" -version = "1.0.26" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743" +checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" dependencies = [ "crc32fast", "miniz_oxide", @@ -1606,14 +1573,10 @@ dependencies = [ [[package]] name = "flume" -version = "0.10.14" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1657b4441c3403d9f7b3409e47575237dac27b1b5726df654a6ecbf92f0f7577" +checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" dependencies = [ - "futures-core", - "futures-sink", - "nanorand", - "pin-project", "spin", ] @@ -1658,9 +1621,9 @@ dependencies = [ [[package]] name = "futures" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" +checksum = "da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335" dependencies = [ "futures-channel", "futures-core", @@ -1673,9 +1636,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" +checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" dependencies = [ "futures-core", "futures-sink", @@ -1683,15 +1646,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" +checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" [[package]] name = "futures-executor" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" +checksum = "0f4fb8693db0cf099eadcca0efe2a5a22e4550f98ed16aba6c48700da29597bc" dependencies = [ "futures-core", "futures-task", @@ -1700,9 +1663,9 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" +checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" [[package]] name = "futures-lite" @@ -1710,43 +1673,38 @@ version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" dependencies = [ - "fastrand", "futures-core", - "futures-io", - "memchr", - "parking", "pin-project-lite", - "waker-fn", ] [[package]] name = "futures-macro" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" +checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.38", ] [[package]] name = "futures-sink" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" +checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" [[package]] name = "futures-task" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" +checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" [[package]] name = "futures-util" -version = "0.3.28" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" +checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" dependencies = [ "futures-channel", "futures-core", @@ -1860,10 +1818,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" dependencies = [ "cfg-if", - "js-sys", "libc", "wasi 0.11.0+wasi-snapshot-preview1", - "wasm-bindgen", ] [[package]] @@ -1878,9 +1834,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.27.3" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" +checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" [[package]] name = "gio" @@ -1976,7 +1932,7 @@ dependencies = [ [[package]] name = "goxlr-audio" -version = "0.12.6" +version = "1.0.0" dependencies = [ "anyhow", "bounded-vec-deque", @@ -1994,10 +1950,10 @@ dependencies = [ [[package]] name = "goxlr-client" -version = "0.12.6" +version = "1.0.0" dependencies = [ "anyhow", - "clap 4.3.19", + "clap 4.4.7", "clap_complete", "goxlr-ipc", "goxlr-types", @@ -2011,7 +1967,7 @@ dependencies = [ [[package]] name = "goxlr-daemon" -version = "0.12.6" +version = "1.0.0" dependencies = [ "actix", "actix-cors", @@ -2021,7 +1977,7 @@ dependencies = [ "byteorder", "cfg-if", "chrono", - "clap 4.3.19", + "clap 4.4.7", "clap_complete", "directories", "dunce", @@ -2044,9 +2000,10 @@ dependencies = [ "ksni", "lazy_static", "log", + "log-panics", "mime_guess", "mslnk", - "nix 0.26.2", + "nix 0.26.4", "notify", "opener", "rand 0.8.5", @@ -2059,6 +2016,7 @@ dependencies = [ "strum 0.24.1", "tao", "tasklist", + "tempfile", "tokio", "tokio-serde", "tts", @@ -2072,27 +2030,15 @@ dependencies = [ [[package]] name = "goxlr-defaults" -version = "0.12.6" +version = "1.0.0" dependencies = [ - "clap 4.3.19", + "clap 4.4.7", "include_dir", ] -[[package]] -name = "goxlr-firmware" -version = "0.12.6" -dependencies = [ - "anyhow", - "byteorder", - "goxlr-ipc", - "goxlr-types", - "goxlr-usb", - "tokio", -] - [[package]] name = "goxlr-initialiser" -version = "0.12.6" +version = "1.0.0" dependencies = [ "anyhow", "cfg-if", @@ -2101,7 +2047,7 @@ dependencies = [ [[package]] name = "goxlr-ipc" -version = "0.12.6" +version = "1.0.0" dependencies = [ "anyhow", "async-trait", @@ -2122,13 +2068,13 @@ dependencies = [ [[package]] name = "goxlr-launcher" -version = "0.12.6" +version = "1.0.0" dependencies = [ "anyhow", "goxlr-ipc", "goxlr-types", "interprocess", - "nix 0.26.2", + "nix 0.26.4", "sysinfo", "tasklist", "tokio", @@ -2138,7 +2084,7 @@ dependencies = [ [[package]] name = "goxlr-profile-loader" -version = "0.12.6" +version = "1.0.0" dependencies = [ "anyhow", "byteorder", @@ -2149,13 +2095,14 @@ dependencies = [ "rand 0.8.5", "ritelinked", "strum 0.24.1", + "tempfile", "thiserror", "zip", ] [[package]] name = "goxlr-scribbles" -version = "0.12.6" +version = "1.0.0" dependencies = [ "anyhow", "image", @@ -2166,9 +2113,9 @@ dependencies = [ [[package]] name = "goxlr-types" -version = "0.12.6" +version = "1.0.0" dependencies = [ - "clap 4.3.19", + "clap 4.4.7", "derivative", "enum-map", "enumset", @@ -2179,7 +2126,7 @@ dependencies = [ [[package]] name = "goxlr-usb" -version = "0.12.6" +version = "1.0.0" dependencies = [ "anyhow", "byteorder", @@ -2188,7 +2135,7 @@ dependencies = [ "enumset", "goxlr-types", "lazy_static", - "libloading 0.8.0", + "libloading 0.8.1", "log", "rand 0.8.5", "rusb", @@ -2206,7 +2153,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6bb81d22191b89b117cd12d6549544bfcba0da741efdcec7c7d2fd06a0f56363" dependencies = [ - "ahash 0.7.6", + "ahash 0.7.7", "hashbrown 0.11.2", ] @@ -2267,9 +2214,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.20" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97ec8491ebaf99c8eaa73058b045fe58073cd6be7f596ac993ced0b0a0c01049" +checksum = "91fc23aa11be92976ef4729127f1a74adf36d8436f7816b185d18df956790833" dependencies = [ "bytes", "fnv", @@ -2299,7 +2246,7 @@ version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" dependencies = [ - "ahash 0.7.6", + "ahash 0.7.7", ] [[package]] @@ -2308,14 +2255,14 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" dependencies = [ - "ahash 0.7.6", + "ahash 0.7.7", ] [[package]] name = "hashbrown" -version = "0.14.0" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" +checksum = "f93e7192158dbcda357bdec5fb5788eebf8bbac027f3f33e719d29135ae84156" [[package]] name = "heck" @@ -2343,15 +2290,24 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.3.2" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" + +[[package]] +name = "home" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" +checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb" +dependencies = [ + "windows-sys 0.48.0", +] [[package]] name = "hound" -version = "3.5.0" +version = "3.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d13cdbd5dbb29f9c88095bbdc2590c9cba0d0a1269b983fef6b2cdd7e9f4db1" +checksum = "62adaabb884c94955b19907d60019f4e145d091c75345379e70d1ee696f7854f" [[package]] name = "http" @@ -2383,9 +2339,9 @@ checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" [[package]] name = "httpdate" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" @@ -2404,7 +2360,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2", + "socket2 0.4.10", "tokio", "tower-service", "tracing", @@ -2413,16 +2369,16 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.57" +version = "0.1.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fad5b825842d2b38bd206f3e81d6957625fd7f0a361e345c30e01a0ae2dd613" +checksum = "8326b86b6cff230b97d0d312a6c40a60726df3332e721f72a1b035f451663b20" dependencies = [ "android_system_properties", - "core-foundation-sys 0.8.4", + "core-foundation-sys", "iana-time-zone-haiku", "js-sys", "wasm-bindgen", - "windows 0.48.0", + "windows-core", ] [[package]] @@ -2452,9 +2408,9 @@ dependencies = [ [[package]] name = "image" -version = "0.24.6" +version = "0.24.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "527909aa81e20ac3a44803521443a765550f09b5130c2c2fa1ea59c2f8f50a3a" +checksum = "6f3dfdbdd72063086ff443e297b61695500514b1e41095b6fb9a5ab48a70a711" dependencies = [ "bytemuck", "byteorder", @@ -2518,12 +2474,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.0.0" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d" +checksum = "8adf3ddd720272c6ea8bf59463c04e0f93d0bbf7c5439b691bca2987e0270897" dependencies = [ "equivalent", - "hashbrown 0.14.0", + "hashbrown 0.14.2", ] [[package]] @@ -2584,20 +2540,9 @@ checksum = "ae52f28f45ac2bc96edb7714de995cffc174a395fb0abf5bff453587c980d7b9" [[package]] name = "ipnet" -version = "2.8.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28b29a3cd74f0f4598934efe3aeba42bae0eb4680554128851ebbecb02af14e6" - -[[package]] -name = "is-terminal" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" -dependencies = [ - "hermit-abi 0.3.2", - "rustix", - "windows-sys 0.48.0", -] +checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" [[package]] name = "itertools" @@ -2666,9 +2611,9 @@ checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" [[package]] name = "jobserver" -version = "0.1.26" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "936cfd212a0155903bcbc060e316fb6cc7cbf2e1907329391ebadc1fe0ce77c2" +checksum = "8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d" dependencies = [ "libc", ] @@ -2705,9 +2650,9 @@ dependencies = [ [[package]] name = "jsonpath-rust" -version = "0.3.1" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b55563e28c54b1cc0d7eb92475cf9e210cd58e2fce9fabbc0cb5bb1136b4ab3" +checksum = "96b6dbeddb7dfade1d4775f1f21bf67174f11b0611b9235349aa7c9073f40543" dependencies = [ "pest", "pest_derive", @@ -2717,9 +2662,9 @@ dependencies = [ [[package]] name = "kqueue" -version = "1.0.7" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c8fc60ba15bf51257aa9807a48a61013db043fcf3a78cb0d916e8e396dcad98" +checksum = "7447f1ca1b7b563588a205fe93dea8df60fd981423a768bc1c0ded35ed147d0c" dependencies = [ "kqueue-sys", "libc", @@ -2727,9 +2672,9 @@ dependencies = [ [[package]] name = "kqueue-sys" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8367585489f01bc55dd27404dcf56b95e6da061a256a666ab23be9ba96a2e587" +checksum = "ed9625ffda8729b85e45cf04090035ac368927b8cebc34898e7c120f52e4838b" dependencies = [ "bitflags 1.3.2", "libc", @@ -2797,9 +2742,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.147" +version = "0.2.149" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" +checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b" [[package]] name = "libdbus-sys" @@ -2822,9 +2767,9 @@ dependencies = [ [[package]] name = "libloading" -version = "0.8.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d580318f95776505201b28cf98eb1fa5e4be3b689633ba6a3e6cd880ff22d8cb" +checksum = "c571b676ddfc9a8c12f1f3d3085a7b163966a8fd8098a90640953ce5f6170161" dependencies = [ "cfg-if", "windows-sys 0.48.0", @@ -2892,19 +2837,18 @@ dependencies = [ [[package]] name = "linux-raw-sys" -version = "0.4.3" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09fc20d2ca12cb9f044c93e3bd6d32d523e6e2ec3db4f7b2939cd99026ecd3f0" +checksum = "da2479e8c062e40bf0066ffa0bc823de0a9368974af99c9f6df941d2c231e03f" [[package]] name = "local-channel" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f303ec0e94c6c54447f84f3b0ef7af769858a9c4ef56ef2a986d3dcd4c3fc9c" +checksum = "e0a493488de5f18c8ffcba89eebb8532ffc562dc400490eb65b84893fae0b178" dependencies = [ "futures-core", "futures-sink", - "futures-util", "local-waker", ] @@ -2916,9 +2860,9 @@ checksum = "e34f76eb3611940e0e7d53a9aaa4e6a3151f69541a282fd0dad5571420c53ff1" [[package]] name = "lock_api" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" +checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" dependencies = [ "autocfg", "scopeguard", @@ -2926,9 +2870,19 @@ dependencies = [ [[package]] name = "log" -version = "0.4.19" +version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" + +[[package]] +name = "log-panics" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68f9dd8546191c1850ecf67d22f5ff00a935b890d0e84713159a55495cc2ac5f" +dependencies = [ + "backtrace", + "log", +] [[package]] name = "mach2" @@ -2950,9 +2904,9 @@ dependencies = [ [[package]] name = "matrixmultiply" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "090126dc04f95dc0d1c1c91f61bdd474b3930ca064c1edc8a849da2c6cbe1e77" +checksum = "7574c1cf36da4798ab73da5b215bbf444f50718207754cb522201d78d1cd0ff2" dependencies = [ "autocfg", "rawpointer", @@ -2960,9 +2914,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.5.0" +version = "2.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" [[package]] name = "memoffset" @@ -3016,9 +2970,9 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" +checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0" dependencies = [ "libc", "log", @@ -3052,15 +3006,6 @@ dependencies = [ "typenum", ] -[[package]] -name = "nanorand" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" -dependencies = [ - "getrandom 0.2.10", -] - [[package]] name = "ndk" version = "0.6.0" @@ -3154,16 +3099,15 @@ dependencies = [ [[package]] name = "nix" -version = "0.26.2" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfdda3d196821d6af13126e40375cdf7da646a96114af134d5f417a9a1dc8e1a" +checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" dependencies = [ "bitflags 1.3.2", "cfg-if", "libc", "memoffset 0.7.1", "pin-utils", - "static_assertions", ] [[package]] @@ -3219,9 +3163,9 @@ dependencies = [ [[package]] name = "num-bigint" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" +checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" dependencies = [ "autocfg", "num-integer", @@ -3230,9 +3174,9 @@ dependencies = [ [[package]] name = "num-complex" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02e0d21255c828d6f128a1e41534206671e8c3ea0c62f32291e808dc82cff17d" +checksum = "1ba157ca0885411de85d6ca030ba7e2a83a28636056c7c699b07c8b6f7383214" dependencies = [ "num-traits", ] @@ -3283,9 +3227,9 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" +checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" dependencies = [ "autocfg", ] @@ -3296,7 +3240,7 @@ version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi 0.3.2", + "hermit-abi 0.3.3", "libc", ] @@ -3351,9 +3295,9 @@ dependencies = [ [[package]] name = "object" -version = "0.31.1" +version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1" +checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" dependencies = [ "memchr", ] @@ -3447,12 +3391,6 @@ dependencies = [ "system-deps", ] -[[package]] -name = "parking" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14f2252c834a40ed9bb5422029649578e63aa341ac401f74e719dd1afda8394e" - [[package]] name = "parking_lot" version = "0.12.1" @@ -3465,15 +3403,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.8" +version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" +checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.3.5", + "redox_syscall 0.4.1", "smallvec", - "windows-targets 0.48.1", + "windows-targets 0.48.5", ] [[package]] @@ -3496,19 +3434,20 @@ checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" [[package]] name = "pest" -version = "2.7.1" +version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d2d1d55045829d65aad9d389139882ad623b33b904e7c9f1b10c5b8927298e5" +checksum = "ae9cee2a55a544be8b89dc6848072af97a20f2422603c10865be2a42b580fff5" dependencies = [ + "memchr", "thiserror", "ucd-trie", ] [[package]] name = "pest_derive" -version = "2.7.1" +version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f94bca7e7a599d89dea5dfa309e217e7906c3c007fb9c3299c40b10d6a315d3" +checksum = "81d78524685f5ef2a3b3bd1cafbc9fcabb036253d9b1463e726a91cd16e2dfc2" dependencies = [ "pest", "pest_generator", @@ -3516,22 +3455,22 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.7.1" +version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99d490fe7e8556575ff6911e45567ab95e71617f43781e5c05490dc8d75c965c" +checksum = "68bd1206e71118b5356dae5ddc61c8b11e28b09ef6a31acbd15ea48a28e0c227" dependencies = [ "pest", "pest_meta", "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.38", ] [[package]] name = "pest_meta" -version = "2.7.1" +version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2674c66ebb4b4d9036012091b537aae5878970d6999f81a265034d85b136b341" +checksum = "7c747191d4ad9e4a4ab9c8798f1e82a39affe7ef9648390b7e5548d18e099de6" dependencies = [ "once_cell", "pest", @@ -3540,29 +3479,29 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "030ad2bc4db10a8944cb0d837f158bdfec4d4a4873ab701a95046770d11f8842" +checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec2e072ecce94ec471b13398d5402c188e76ac03cf74dd1a975161b23a3f6d9c" +checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.38", ] [[package]] name = "pin-project-lite" -version = "0.2.10" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c40d25201921e5ff0c862a505c6557ea88568a4e3ace775ab55e93f2f4f9d57" +checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" [[package]] name = "pin-utils" @@ -3570,6 +3509,17 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "piper" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "668d31b1c4eba19242f2088b2bf3316b82ca31082a8335764db4e083db7485d4" +dependencies = [ + "atomic-waker", + "fastrand", + "futures-io", +] + [[package]] name = "pkg-config" version = "0.3.27" @@ -3578,9 +3528,9 @@ checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" [[package]] name = "png" -version = "0.17.9" +version = "0.17.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59871cc5b6cce7eaccca5a802b4173377a1c2ba90654246789a8fa2334426d11" +checksum = "dd75bf2d8dd3702b9707cdbc56a5b9ef42cec752eb8b3bafc01234558442aa64" dependencies = [ "bitflags 1.3.2", "crc32fast", @@ -3589,6 +3539,12 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + [[package]] name = "ppv-lite86" version = "0.2.17" @@ -3597,12 +3553,12 @@ checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] name = "prettyplease" -version = "0.2.12" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c64d9ba0963cdcea2e1b2230fbae2bab30eb25a174be395c41e764bfb65dd62" +checksum = "ae005bd773ab59b4725093fd7df83fd7892f7d8eafb48dbd7de6e024e4215f9d" dependencies = [ "proc-macro2", - "syn 2.0.27", + "syn 2.0.38", ] [[package]] @@ -3621,7 +3577,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" dependencies = [ "once_cell", - "toml_edit", + "toml_edit 0.19.15", ] [[package]] @@ -3650,9 +3606,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.66" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" +checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" dependencies = [ "unicode-ident", ] @@ -3677,9 +3633,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.32" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50f3b39ccfb720540debaa0164757101c08ecb8d326b15358ce76a62c7e85965" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" dependencies = [ "proc-macro2", ] @@ -3778,9 +3734,9 @@ checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" [[package]] name = "rayon" -version = "1.7.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b" +checksum = "9c27db03db7734835b3f53954b534c91069375ce6ccaa2e065441e07d9b6cdb1" dependencies = [ "either", "rayon-core", @@ -3788,14 +3744,12 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d" +checksum = "5ce3fb6ad83f861aac485e76e1985cd109d9a3713802152be56c3b1f0e0658ed" dependencies = [ - "crossbeam-channel", "crossbeam-deque", "crossbeam-utils", - "num_cpus", ] [[package]] @@ -3831,6 +3785,15 @@ dependencies = [ "bitflags 1.3.2", ] +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags 1.3.2", +] + [[package]] name = "redox_users" version = "0.4.3" @@ -3844,9 +3807,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.9.1" +version = "1.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2eae68fc220f7cf2532e4494aded17545fce192d59cd996e0fe7887f4ceb575" +checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" dependencies = [ "aho-corasick", "memchr", @@ -3856,9 +3819,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.3.3" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39354c10dd07468c2e73926b23bb9c2caca74c5501e38a35da70406f1d923310" +checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" dependencies = [ "aho-corasick", "memchr", @@ -3867,15 +3830,15 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.7.4" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "reqwest" -version = "0.11.18" +version = "0.11.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cde824a14b7c14f85caff81225f411faacc04a2013f41670f41443742b1c1c55" +checksum = "046cd98826c46c2ac8ddecae268eb5c2e58628688a5fc7a2643704a73faba95b" dependencies = [ "base64", "bytes", @@ -3896,13 +3859,14 @@ dependencies = [ "serde", "serde_json", "serde_urlencoded", + "system-configuration", "tokio", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "winreg 0.10.1", + "winreg 0.50.0", ] [[package]] @@ -3911,7 +3875,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "98f2771d255fd99f0294f13249fecd0cae6e074f86b4197ec1f1689d537b44d3" dependencies = [ - "ahash 0.7.6", + "ahash 0.7.7", "griddle", "hashbrown 0.11.2", ] @@ -3930,9 +3894,9 @@ dependencies = [ [[package]] name = "rusb" -version = "0.9.2" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44a8c36914f9b1a3be712c1dfa48c9b397131f9a75707e570a391735f785c5d1" +checksum = "45fff149b6033f25e825cbb7b2c625a11ee8e6dac09264d49beb125e39aa97bf" dependencies = [ "libc", "libusb1-sys", @@ -3986,11 +3950,11 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.4" +version = "0.38.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a962918ea88d644592894bc6dc55acc6c0956488adcebbfb6e273506b7fd6e5" +checksum = "2b426b0506e5d50a7d8dafcf2e81471400deb602392c7dd110815afb4eaf02a3" dependencies = [ - "bitflags 2.3.3", + "bitflags 2.4.1", "errno", "libc", "linux-raw-sys", @@ -4045,35 +4009,35 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "semver" -version = "1.0.18" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" +checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" [[package]] name = "serde" -version = "1.0.175" +version = "1.0.190" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d25439cd7397d044e2748a6fe2432b5e85db703d6d097bd014b3c0ad1ebff0b" +checksum = "91d3c334ca1ee894a2c6f6ad698fe8c435b76d504b13d436f0685d648d6d96f7" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.175" +version = "1.0.190" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b23f7ade6f110613c0d63858ddb8b94c1041f550eab58a16b371bdf2c9c80ab4" +checksum = "67c5609f394e5c2bd7fc51efda478004ea80ef42fee983d5c67a65e34f32c0e3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.38", ] [[package]] name = "serde_json" -version = "1.0.103" +version = "1.0.107" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d03b412469450d4404fe8499a268edd7f8b79fecb074b0d812ad64ca21f4031b" +checksum = "6b420ce6e3d8bd882e9b243c6eed35dbc9a6110c9769e74b584e0d68d1f20c65" dependencies = [ "itoa", "ryu", @@ -4082,20 +4046,20 @@ dependencies = [ [[package]] name = "serde_repr" -version = "0.1.15" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e168eaaf71e8f9bd6037feb05190485708e019f4fd87d161b3c0a0d37daf85e5" +checksum = "8725e1dfadb3a50f7e5ce0b1a540466f6ed3fe7a0fca2ac2b8b831d31316bd00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.38", ] [[package]] name = "serde_spanned" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96426c9936fd7a0124915f9185ea1d20aa9445cc9821142f0a73bc9207a2e186" +checksum = "12022b835073e5b11e90a14f86838ceb1c8fb0325b72416845c487ac0fa95e80" dependencies = [ "serde", ] @@ -4114,9 +4078,9 @@ dependencies = [ [[package]] name = "sha1" -version = "0.10.5" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ "cfg-if", "cpufeatures", @@ -4125,9 +4089,9 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.7" +version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", @@ -4142,9 +4106,9 @@ checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" [[package]] name = "shlex" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3" +checksum = "a7cee0529a6d40f580e7a5e6c495c8fbfe21b7b52795ed4bb5e62cdf92bc6380" [[package]] name = "signal-hook-registry" @@ -4187,29 +4151,39 @@ dependencies = [ [[package]] name = "slab" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" dependencies = [ "autocfg", ] [[package]] name = "smallvec" -version = "1.11.0" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" +checksum = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a" [[package]] name = "socket2" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" +checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" dependencies = [ "libc", "winapi", ] +[[package]] +name = "socket2" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" +dependencies = [ + "libc", + "windows-sys 0.48.0", +] + [[package]] name = "speech-dispatcher" version = "0.16.0" @@ -4227,7 +4201,7 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c3e8acdf2b1f4bb13f1813b40b52f3edf4cc94d8a55fe713a584f672a10388d" dependencies = [ - "bindgen 0.66.1", + "bindgen", ] [[package]] @@ -4248,12 +4222,6 @@ dependencies = [ "lock_api", ] -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - [[package]] name = "strength_reduce" version = "0.2.4" @@ -4474,9 +4442,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.27" +version = "2.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b60f673f44a8255b9c8c657daf66a596d435f2da81a555b06dc644d080ba45e0" +checksum = "e96b79aaa137db8f61e26363a0c9b47d8b4ec75da28b7d1d614c2303e232408b" dependencies = [ "proc-macro2", "quote", @@ -4485,12 +4453,12 @@ dependencies = [ [[package]] name = "sysinfo" -version = "0.29.6" +version = "0.29.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7cb97a5a85a136d84e75d5c3cf89655090602efb1be0d8d5337b7e386af2908" +checksum = "0a18d114d420ada3a891e6bc8e96a2023402203296a47cdd65083377dad18ba5" dependencies = [ "cfg-if", - "core-foundation-sys 0.8.4", + "core-foundation-sys", "libc", "ntapi", "once_cell", @@ -4498,11 +4466,32 @@ dependencies = [ "winapi", ] +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "system-deps" -version = "6.1.1" +version = "6.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30c2de8a4d8f4b823d634affc9cd2a74ec98c53a756f317e529a48046cbf71f3" +checksum = "94af52f9402f94aac4948a2518b43359be8d9ce6cd9efc1c4de3b2f7b7e897d6" dependencies = [ "cfg-expr", "heck 0.4.1", @@ -4560,19 +4549,32 @@ dependencies = [ [[package]] name = "target-lexicon" -version = "0.12.10" +version = "0.12.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d2faeef5759ab89935255b1a4cd98e0baf99d1085e37d36599c625dac49ae8e" +checksum = "14c39fd04924ca3a864207c66fc2cd7d22d7c016007f9ce846cbb9326331930a" [[package]] name = "tasklist" -version = "0.2.12" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "355554b5202fdbe9b9f861ddc6026e4e5ceb03b8ce461e644668a4a1c3aa1112" +checksum = "3e1714c0b833ca8b7c7ec800b27fda36d4d0fefc69d649bc0d72bf75ee18d9fc" dependencies = [ "windows 0.38.0", ] +[[package]] +name = "tempfile" +version = "3.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5" +dependencies = [ + "cfg-if", + "fastrand", + "redox_syscall 0.4.1", + "rustix", + "windows-sys 0.48.0", +] + [[package]] name = "termcolor" version = "1.1.3" @@ -4593,29 +4595,29 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.44" +version = "1.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "611040a08a0439f8248d1990b111c95baa9c704c805fa1f62104b39655fd7f90" +checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.44" +version = "1.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "090198534930841fab3a5d1bb637cde49e339654e606195f8d9c76eeb081dc96" +checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.38", ] [[package]] name = "tiff" -version = "0.8.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7449334f9ff2baf290d55d73983a7d6fa15e01198faef72af07e2a8db851e471" +checksum = "6d172b0f4d3fba17ba89811858b9d3d97f928aece846475bbda076ca46736211" dependencies = [ "flate2", "jpeg-decoder", @@ -4624,13 +4626,15 @@ dependencies = [ [[package]] name = "time" -version = "0.3.23" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59e399c068f43a5d116fedaf73b203fa4f9c519f17e2b34f63221d3792f81446" +checksum = "c4a34ab300f2dee6e562c10a046fc05e358b29f9bf92277f30c3c8d82275f6f5" dependencies = [ + "deranged", "itoa", "libc", "num_threads", + "powerfmt", "serde", "time-core", "time-macros", @@ -4638,15 +4642,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.10" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96ba15a897f3c86766b757e5ac7221554c6750054d74d5b28844fce5fb36a6c4" +checksum = "4ad70d68dba9e1f8aceda7aa6711965dfec1cac869f311a51bd08b3a2ccbce20" dependencies = [ "time-core", ] @@ -4674,11 +4678,10 @@ checksum = "c7c4ceeeca15c8384bbc3e011dbd8fccb7f068a440b752b7d9b32ceb0ca0e2e8" [[package]] name = "tokio" -version = "1.29.1" +version = "1.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "532826ff75199d5833b9d2c5fe410f29235e25704ee5f0ef599fb51c21f4a4da" +checksum = "4f38200e3ef7995e5ef13baec2f432a6da0aa9ac495b2c0e8f3b7eec2c92d653" dependencies = [ - "autocfg", "backtrace", "bytes", "libc", @@ -4687,7 +4690,7 @@ dependencies = [ "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2", + "socket2 0.5.5", "tokio-macros", "windows-sys 0.48.0", ] @@ -4700,7 +4703,7 @@ checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.38", ] [[package]] @@ -4721,9 +4724,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.8" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" +checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" dependencies = [ "bytes", "futures-core", @@ -4757,32 +4760,43 @@ dependencies = [ [[package]] name = "toml" -version = "0.7.6" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17e963a819c331dcacd7ab957d80bc2b9a9c1e71c804826d2f283dd65306542" +checksum = "8ff9e3abce27ee2c9a37f9ad37238c1bdd4e789c84ba37df76aa4d528f5072cc" dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit", + "toml_edit 0.20.7", ] [[package]] name = "toml_datetime" -version = "0.6.3" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" dependencies = [ "serde", ] [[package]] name = "toml_edit" -version = "0.19.14" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap 2.0.2", + "toml_datetime", + "winnow", +] + +[[package]] +name = "toml_edit" +version = "0.20.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8123f27e969974a3dfba720fdb560be359f57b44302d280ba72e76a74480e8a" +checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" dependencies = [ - "indexmap 2.0.0", + "indexmap 2.0.2", "serde", "serde_spanned", "toml_datetime", @@ -4797,11 +4811,10 @@ checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" [[package]] name = "tracing" -version = "0.1.37" +version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ - "cfg-if", "log", "pin-project-lite", "tracing-core", @@ -4809,9 +4822,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.31" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" dependencies = [ "once_cell", ] @@ -4849,9 +4862,9 @@ checksum = "7b3e06c9b9d80ed6b745c7159c40b311ad2916abb34a49e9be2653b90db0d8dd" [[package]] name = "tts" -version = "0.25.5" +version = "0.25.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e339627916d1e1425f806c68b57d7eb6f9486ef0500829b1324556bef3b4fa2d" +checksum = "aee57eae77c7059f02e9ae166cd3ef4973e62c859b1eeaf9a738032a5b1c38e4" dependencies = [ "cocoa-foundation", "core-foundation", @@ -4869,14 +4882,14 @@ dependencies = [ "tolk", "wasm-bindgen", "web-sys", - "windows 0.48.0", + "windows 0.51.1", ] [[package]] name = "typenum" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "ucd-trie" @@ -4886,9 +4899,9 @@ checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" [[package]] name = "unicase" -version = "2.6.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" +checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" dependencies = [ "version_check", ] @@ -4901,9 +4914,9 @@ checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" [[package]] name = "unicode-ident" -version = "1.0.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "unicode-normalization" @@ -4922,15 +4935,15 @@ checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" [[package]] name = "unicode-width" -version = "0.1.10" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" +checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" [[package]] name = "url" -version = "2.4.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb" +checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5" dependencies = [ "form_urlencoded", "idna", @@ -4945,9 +4958,9 @@ checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" [[package]] name = "uuid" -version = "1.4.1" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79daa5ed5740825c40b389c5e50312b9c86df53fccd33f281df655642b43869d" +checksum = "88ad59a7560b41a70d191093a945f0b87bc1deeda46fb237479708a1d6b6cdfc" dependencies = [ "getrandom 0.2.10", ] @@ -4976,17 +4989,11 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" -[[package]] -name = "waker-fn" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca" - [[package]] name = "walkdir" -version = "2.3.3" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698" +checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" dependencies = [ "same-file", "winapi-util", @@ -5034,7 +5041,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.38", "wasm-bindgen-shared", ] @@ -5068,7 +5075,7 @@ checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.27", + "syn 2.0.38", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -5097,20 +5104,21 @@ checksum = "9193164d4de03a926d909d3bc7c30543cecb35400c02114792c2cae20d5e2dbb" [[package]] name = "which" -version = "4.4.0" +version = "4.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2441c784c52b289a054b7201fc93253e288f094e2f4be9058343127c4226a269" +checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" dependencies = [ "either", - "libc", + "home", "once_cell", + "rustix", ] [[package]] name = "wide" -version = "0.7.11" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa469ffa65ef7e0ba0f164183697b89b854253fd31aeb92358b7b6155177d62f" +checksum = "c68938b57b33da363195412cfc5fc37c9ed49aa9cfe2156fde64b8d2c9498242" dependencies = [ "bytemuck", "safe_arch", @@ -5156,9 +5164,9 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" dependencies = [ "winapi", ] @@ -5223,7 +5231,17 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" dependencies = [ - "windows-targets 0.48.1", + "windows-targets 0.48.5", +] + +[[package]] +name = "windows" +version = "0.51.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca229916c5ee38c2f2bc1e9d8f04df975b4bd93f9955dc69fabb5d91270045c9" +dependencies = [ + "windows-core", + "windows-targets 0.48.5", ] [[package]] @@ -5235,6 +5253,15 @@ dependencies = [ "wtf8", ] +[[package]] +name = "windows-core" +version = "0.51.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64" +dependencies = [ + "windows-targets 0.48.5", +] + [[package]] name = "windows-implement" version = "0.39.0" @@ -5260,7 +5287,7 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets 0.48.1", + "windows-targets 0.48.5", ] [[package]] @@ -5280,17 +5307,17 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.48.1" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ - "windows_aarch64_gnullvm 0.48.0", - "windows_aarch64_msvc 0.48.0", - "windows_i686_gnu 0.48.0", - "windows_i686_msvc 0.48.0", - "windows_x86_64_gnu 0.48.0", - "windows_x86_64_gnullvm 0.48.0", - "windows_x86_64_msvc 0.48.0", + "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]] @@ -5307,9 +5334,9 @@ checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_msvc" @@ -5331,9 +5358,9 @@ checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" [[package]] name = "windows_aarch64_msvc" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_i686_gnu" @@ -5361,9 +5388,9 @@ checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" [[package]] name = "windows_i686_gnu" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_msvc" @@ -5391,9 +5418,9 @@ checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" [[package]] name = "windows_i686_msvc" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_x86_64_gnu" @@ -5421,9 +5448,9 @@ checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" [[package]] name = "windows_x86_64_gnu" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnullvm" @@ -5433,9 +5460,9 @@ checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" [[package]] name = "windows_x86_64_gnullvm" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_msvc" @@ -5463,9 +5490,9 @@ checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" [[package]] name = "windows_x86_64_msvc" -version = "0.48.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windres" @@ -5479,9 +5506,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.5.1" +version = "0.5.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25b5872fa2e10bd067ae946f927e726d7d603eaeb6e02fa6a350e0722d2b8c11" +checksum = "a3b801d0e0a6726477cc207f60162da452f3a95adb368399bef20a946e06f65c" dependencies = [ "memchr", ] @@ -5564,9 +5591,29 @@ dependencies = [ [[package]] name = "xml-rs" -version = "0.8.16" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47430998a7b5d499ccee752b41567bc3afc57e1327dc855b1a2aa44ce29b5fa1" +checksum = "0fcb9cbac069e033553e8bb871be2fbdffcab578eb25bd0f7c508cedc6dcd75a" + +[[package]] +name = "zerocopy" +version = "0.7.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd66a62464e3ffd4e37bd09950c2b9dd6c4f8767380fabba0d523f9a775bc85a" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "255c4596d41e6916ced49cfafea18727b24d67878fa180ddfd69b9df34fd1726" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.38", +] [[package]] name = "zip" diff --git a/Cargo.toml b/Cargo.toml index d13fe457..45f601f5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,4 +1,5 @@ [workspace] +resolver = "2" members = [ "launcher", @@ -12,5 +13,4 @@ members = [ "initialiser", "scribbles", "defaults", - "firmware", ] diff --git a/audio/Cargo.toml b/audio/Cargo.toml index bfbd8c6f..7efa12c8 100644 --- a/audio/Cargo.toml +++ b/audio/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "goxlr-audio" -version = "0.12.6" +version = "1.0.0" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/audio/src/player.rs b/audio/src/player.rs index e4f41f53..1591c5d5 100644 --- a/audio/src/player.rs +++ b/audio/src/player.rs @@ -92,13 +92,7 @@ impl Player { let format_options = Default::default(); let metadata_options = Default::default(); - let probe_result = symphonia::default::get_probe().format( - &hint, - stream, - &format_options, - &metadata_options, - ); - probe_result + symphonia::default::get_probe().format(&hint, stream, &format_options, &metadata_options) } pub fn calculate_gain(&mut self) { diff --git a/audio/src/pulse/pulse_playback.rs b/audio/src/pulse/pulse_playback.rs index 74b8c5d9..22f4cafc 100644 --- a/audio/src/pulse/pulse_playback.rs +++ b/audio/src/pulse/pulse_playback.rs @@ -72,7 +72,7 @@ impl AudioOutput for PulsePlayback { buffer.extend_from_slice(&sample.to_le_bytes()); } - if self.pulse_simple.write(buffer.as_slice()).is_ok() {} + let _ = self.pulse_simple.write(buffer.as_slice()); Ok(()) } diff --git a/ci/build-packages b/ci/build-packages index e2673cdb..2947b285 100755 --- a/ci/build-packages +++ b/ci/build-packages @@ -45,3 +45,4 @@ cargo deb -p goxlr-daemon --no-build # Then the RPM cargo generate-rpm -p daemon +cargo generate-rpm -p daemon --variant suse diff --git a/ci/nsis/goxlr-utility.nsi b/ci/nsis/goxlr-utility.nsi index f94409ca..0fa14313 100644 --- a/ci/nsis/goxlr-utility.nsi +++ b/ci/nsis/goxlr-utility.nsi @@ -107,14 +107,18 @@ DEFAULT_NOT_FOUND: IfFileExists $0 END ERROR_DEFAULT ERROR_REG: - MessageBox MB_OK|MB_ICONSTOP "Unable to locate the GoXLR Driver, there may be an issue with your installation." + # Registry Entry was missing and file not in default location, driver not installed. + MessageBox MB_OK|MB_ICONSTOP "The GoXLR Driver was not found, please ensure it is installed." Goto END ERROR_DEFAULT: - MessageBox MB_OK|MB_ICONSTOP "The GoXLR Driver was not found, please ensure it is installed." + # Registry Entry found, file not present at registry location nor at default location + MessageBox MB_OK|MB_ICONSTOP "Unable to locate the GoXLR Driver, there may be an issue with your installation." Abort END: +ClearErrors + FunctionEnd var KeyTest @@ -308,6 +312,7 @@ Function CleanOldInstaller FunctionEnd Function InstallWebView + DetailPrint "Downloading Edge Webview.." Delete "$TEMP\MicrosoftEdgeWebview2Setup.exe" nsis_tauri_utils::download "https://go.microsoft.com/fwlink/p/?LinkId=2124703" "$TEMP\MicrosoftEdgeWebview2Setup.exe" @@ -326,12 +331,39 @@ Function InstallWebView ${EndIf} END: + ClearErrors +FunctionEnd + +Function InstallVCRuntime + DetailPrint "Downloading VC Runtime.." + + Delete "$TEMP\vc_redist.x64.exe" + nsis_tauri_utils::download "https://aka.ms/vs/17/release/vc_redist.x64.exe" "$TEMP\vc_redist.x64.exe" + Pop $0 + + ${IfNot} $0 == 0 + DetailPrint "Unable to Download WebView2 Setup, continuing without." + Goto END + ${EndIf} + + DetailPrint "Installing VC Runtime" + ExecWait "$TEMP\vc_redist.x64.exe /silent /install" $1 + ${IfNot} $1 == 0 + DetailPrint "Failed to install VC Runtime, continuing without." + Goto END + ${EndIf} + + END: + ClearErrors FunctionEnd Section "MainSection" SEC01 Call StopUtility Call CleanOldInstaller + ; Make sure the Visual C++ Runtime is installed (TODO: Only on first install) + Call InstallVCRuntime + ; Make sure WebView2 is installed.. ${If} $USE_APP == 1 ${If} $WebViewInstalled == 0 @@ -345,9 +377,9 @@ Section "MainSection" SEC01 ; Ok, here come the files.. File "..\..\target\release\goxlr-daemon.exe" File "..\..\target\release\goxlr-client.exe" + File "..\..\target\release\goxlr-client-quiet.exe" File "..\..\target\release\goxlr-defaults.exe" File "..\..\target\release\goxlr-launcher.exe" - File "..\..\target\release\goxlr-firmware.exe" File "..\..\target\release\goxlr-utility-ui.exe" File "..\..\target\release\SAAPI64.dll" File "..\..\target\release\nvdaControllerClient64.dll" diff --git a/ci/nsis/post-install.ini b/ci/nsis/post-install.ini index d9275c24..aead943f 100644 --- a/ci/nsis/post-install.ini +++ b/ci/nsis/post-install.ini @@ -21,8 +21,8 @@ Bottom=26 [Field 3] Type=Checkbox -Text=Use App instead of Browser tab (EXPERIMENTAL) -State=0 +Text=Use App instead of Browser +State=1 Left=5 Right=203 Top=32 diff --git a/client/Cargo.toml b/client/Cargo.toml index 16604363..33d9c3d8 100644 --- a/client/Cargo.toml +++ b/client/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "goxlr-client" -version = "0.12.6" +version = "1.0.0" edition = "2021" build = "build.rs" authors = ["Nathan Adams ", "Craig McLure ", "Lars Mühlbauer "] @@ -9,7 +9,17 @@ repository = "https://github.com/GoXLR-on-Linux/GoXLR-Utility" license = "MIT" categories = ["hardware-support", "command-line-utilities"] -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +[lib] +name="client" +path="src/lib.rs" + +[[bin]] +name="goxlr-client" +path="src/bin/main.rs" + +[[bin]] +name="goxlr-client-quiet" +path="src/bin/quiet.rs" [dependencies] goxlr-ipc = {path = "../ipc"} diff --git a/client/src/bin/main.rs b/client/src/bin/main.rs new file mode 100644 index 00000000..a69b48fd --- /dev/null +++ b/client/src/bin/main.rs @@ -0,0 +1,7 @@ +use anyhow::Result; +use client::runner; + +#[tokio::main] +async fn main() -> Result<()> { + runner::run_cli().await +} diff --git a/client/src/bin/quiet.rs b/client/src/bin/quiet.rs new file mode 100644 index 00000000..9267387a --- /dev/null +++ b/client/src/bin/quiet.rs @@ -0,0 +1,15 @@ +#![windows_subsystem = "windows"] + +/* + This binary primarily exists so there's an option under windows to run commands without + having a command prompt open, it runs the same code as the main client, but just does so + silently. +*/ + +use anyhow::Result; +use client::runner; + +#[tokio::main] +async fn main() -> Result<()> { + runner::run_cli().await +} diff --git a/client/src/cli.rs b/client/src/cli.rs index be5a0962..172e2d51 100644 --- a/client/src/cli.rs +++ b/client/src/cli.rs @@ -86,6 +86,7 @@ pub enum SubCommands { volume_percent: u8, }, + /// Adjust Submix Settings Submix { #[command(subcommand)] command: SubmixCommands, @@ -141,6 +142,11 @@ pub enum SubCommands { #[clap[subcommand]] command: SamplerCommands, }, + + Settings { + #[clap[subcommand]] + command: DeviceSettings, + }, } fn percent_value(s: &str) -> Result { @@ -173,17 +179,20 @@ fn percent_value_float(s: &str) -> Result { #[derive(Subcommand, Debug)] #[command(arg_required_else_help = true)] pub enum CoughButtonBehaviours { + /// Sets whether the button is only active when held (so not toggled) ButtonIsHold { #[arg(value_parser, action = ArgAction::Set)] is_hold: bool, }, + /// Change the Mute Target on Press MuteBehaviour { /// Where a single press will mute (Hold will always Mute to All) #[arg(value_enum)] mute_behaviour: MuteFunction, }, + /// Change the current button Mute State MuteState { /// The new State #[arg(value_enum)] @@ -268,6 +277,7 @@ pub enum MicrophoneCommands { level: u8, }, + /// Enable Microphone Monitor whenever FX are enabled MonitorMicWithFx { #[arg(value_parser, action = ArgAction::Set)] enabled: bool, @@ -277,12 +287,15 @@ pub enum MicrophoneCommands { #[derive(Subcommand, Debug)] #[command(arg_required_else_help = true)] pub enum SubmixCommands { + /// Enable / Disable SubMixes Enabled { #[arg(value_parser, action = ArgAction::Set)] enabled: bool, }, + /// Change Submix Volumes Volume { + /// The Channel to Change #[arg(value_enum)] channel: ChannelName, @@ -291,23 +304,31 @@ pub enum SubmixCommands { volume_percent: u8, }, + /// Link / Unlink a volume -> submix volume Linked { + /// The Channel to Change #[arg(value_enum)] channel: ChannelName, + /// Whether the channels volumes are linked #[arg(value_parser, action = ArgAction::Set)] linked: bool, }, + /// Set the output mix for a channel OutputMix { + /// The Output Device to Change #[arg(value_enum)] device: OutputDevice, + /// The Mix to Assign #[arg(value_enum)] mix: Mix, }, + /// Activate Mix Monitoring MonitorMix { + /// The Channel to Monitor #[arg(value_enum)] device: OutputDevice, }, @@ -456,6 +477,7 @@ pub enum FaderCommands { state: MuteState, }, + /// Configure the Scribble Screen on a Fader Scribbles { #[command(subcommand)] command: Scribbles, @@ -463,28 +485,43 @@ pub enum FaderCommands { } #[derive(Subcommand, Debug)] pub enum Scribbles { + /// Change a Scribble Icon Icon { + /// The Fader to Change #[arg(value_enum)] fader: FaderName, + + /// The name of the Icon file name: Option, }, + /// Change the Text on a Scribble Text { + /// The Fader to Change #[arg(value_enum)] fader: FaderName, + + /// The text to display text: String, }, + /// Change the Number field (Top Left) Number { + /// The Fader to Change #[arg(value_enum)] fader: FaderName, + + /// The Text to display text: String, }, + /// Inverts a scribble display Invert { + /// The Fader to Change #[arg(value_enum)] fader: FaderName, + /// Whether the screen is inverted #[arg(value_parser, action = ArgAction::Set)] inverted: bool, }, @@ -504,6 +541,7 @@ pub enum CoughCommands { #[derive(Subcommand, Debug)] #[command(arg_required_else_help = true)] pub enum LightingCommands { + /// Change Global Animation States Animation { #[command(subcommand)] command: AnimationCommands, @@ -536,12 +574,17 @@ pub enum LightingCommands { command: ButtonGroupLightingCommands, }, + /// Change a 'Simple' (one colour) target SimpleColour { + /// The Lighting to Change #[arg(value_enum)] target: SimpleColourTargets, + + /// The New Colour colour: String, }, + /// Change an Encoder Colour EncoderColour { /// The Encoder to Change #[arg(value_enum)] @@ -561,15 +604,35 @@ pub enum LightingCommands { #[derive(Subcommand, Debug)] #[command(arg_required_else_help = true)] pub enum AnimationCommands { - Mode { mode: AnimationMode }, - Mod1 { mod1: u8 }, - Mod2 { mod2: u8 }, - WaterFall { waterfall: WaterfallDirection }, + /// Change the Animation Mod + Mode { + /// The new Mode + mode: AnimationMode, + }, + + /// Change the Mod1 Value + Mod1 { + /// The New Value + mod1: u8, + }, + + /// Change the Mod2 Value + Mod2 { + /// The new Value + mod2: u8, + }, + + /// Change the Waterfall Direction + WaterFall { + /// The Waterfall Direction + waterfall: WaterfallDirection, + }, } #[derive(Subcommand, Debug)] #[command(arg_required_else_help = true)] pub enum FaderLightingCommands { + /// Change the Faders Lighting Mode Display { /// The Fader to Change #[arg(value_enum)] @@ -597,6 +660,7 @@ pub enum FaderLightingCommands { #[derive(Subcommand, Debug)] #[command(arg_required_else_help = true)] pub enum FadersAllLightingCommands { + /// Change the Faders Lighting Mode Display { /// The new display method #[arg(value_enum)] @@ -616,6 +680,7 @@ pub enum FadersAllLightingCommands { #[derive(Subcommand, Debug)] #[command(arg_required_else_help = true)] pub enum ButtonLightingCommands { + /// Change a Buttons Colours Colour { /// The Button to change #[arg(value_enum)] @@ -628,6 +693,7 @@ pub enum ButtonLightingCommands { colour_two: Option, }, + /// Set a Button's "Off" style OffStyle { /// The Button to change #[arg(value_enum)] @@ -642,6 +708,7 @@ pub enum ButtonLightingCommands { #[derive(Subcommand, Debug)] #[command(arg_required_else_help = true)] pub enum ButtonGroupLightingCommands { + /// Change a Buttons Groups Colours Colour { /// The group to change #[arg(value_enum)] @@ -654,6 +721,7 @@ pub enum ButtonGroupLightingCommands { colour_two: Option, }, + /// Change a Button Group's "Off" style OffStyle { /// The group to change #[arg(value_enum)] @@ -1055,3 +1123,42 @@ pub enum SamplerCommands { stop_position: f32, }, } + +#[derive(Subcommand, Debug)] +#[command(arg_required_else_help = true)] +pub enum DeviceSettings { + /// How long to Hold a Mute button before it Mutes to All + MuteHoldDuration { + /// The Duration to Hold + #[arg(value_parser, action = ArgAction::Set)] + duration: u16, + }, + + /// How far in the past the sampler should listen for audio + SamplePreRecordBuffer { + /// The duration in Milliseconds + #[arg(value_parser, action = ArgAction::Set)] + duration: u16, + }, + + /// Enable Mic Monitoring when FX are enabled + MonitorWithFx { + /// Whether the setting is enabled + #[arg(value_parser, action = ArgAction::Set)] + enabled: bool, + }, + + /// Whether to mute The Microphone when Voice Chat is Muted + DeafenOnChatMute { + /// Whether the setting is enabled + #[arg(value_parser, action = ArgAction::Set)] + enabled: bool, + }, + + /// Locks the Faders to their current value on MuteToAll + LockFaders { + /// Whether the setting is enabled + #[arg(value_parser, action = ArgAction::Set)] + enabled: bool, + }, +} diff --git a/client/src/lib.rs b/client/src/lib.rs new file mode 100644 index 00000000..9af88033 --- /dev/null +++ b/client/src/lib.rs @@ -0,0 +1,3 @@ +mod cli; +mod microphone; +pub mod runner; diff --git a/client/src/main.rs b/client/src/runner.rs similarity index 97% rename from client/src/main.rs rename to client/src/runner.rs index 389a5aee..84d7d199 100644 --- a/client/src/main.rs +++ b/client/src/runner.rs @@ -1,6 +1,3 @@ -mod cli; -mod microphone; - use crate::cli::{ AnimationCommands, ButtonGroupLightingCommands, ButtonLightingCommands, CompressorCommands, CoughButtonBehaviours, Echo, EffectsCommands, EqualiserCommands, EqualiserMiniCommands, @@ -8,10 +5,10 @@ use crate::cli::{ LightingCommands, Megaphone, MicrophoneCommands, NoiseGateCommands, Pitch, ProfileAction, ProfileType, Reverb, Robot, SamplerCommands, Scribbles, SubCommands, SubmixCommands, }; +use crate::cli::{Cli, DeviceSettings}; use crate::microphone::apply_microphone_controls; use anyhow::{anyhow, Context, Result}; use clap::Parser; -use cli::Cli; use goxlr_ipc::client::Client; use goxlr_ipc::clients::ipc::ipc_client::IPCClient; use goxlr_ipc::clients::ipc::ipc_socket::Socket; @@ -26,8 +23,7 @@ use strum::IntoEnumIterator; static SOCKET_PATH: &str = "/tmp/goxlr.socket"; static NAMED_PIPE: &str = "@goxlr.socket"; -#[tokio::main] -async fn main() -> Result<()> { +pub async fn run_cli() -> Result<()> { let cli: Cli = Cli::parse(); let mut client: Box; @@ -976,6 +972,36 @@ async fn main() -> Result<()> { .await?; } }, + SubCommands::Settings { command } => match command { + DeviceSettings::MuteHoldDuration { duration } => { + client + .command(&serial, GoXLRCommand::SetMuteHoldDuration(*duration)) + .await?; + } + DeviceSettings::SamplePreRecordBuffer { duration } => { + client + .command( + &serial, + GoXLRCommand::SetSamplerPreBufferDuration(*duration), + ) + .await?; + } + DeviceSettings::MonitorWithFx { enabled } => { + client + .command(&serial, GoXLRCommand::SetMonitorWithFx(*enabled)) + .await?; + } + DeviceSettings::DeafenOnChatMute { enabled } => { + client + .command(&serial, GoXLRCommand::SetVCMuteAlsoMuteCM(*enabled)) + .await?; + } + DeviceSettings::LockFaders { enabled } => { + client + .command(&serial, GoXLRCommand::SetLockFaders(*enabled)) + .await?; + } + }, } } } diff --git a/daemon/Cargo.toml b/daemon/Cargo.toml index 2cde0782..5a162d10 100644 --- a/daemon/Cargo.toml +++ b/daemon/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "goxlr-daemon" -version = "0.12.6" +version = "1.0.0" edition = "2021" authors = ["Nathan Adams ", "Craig McLure ", "Lars Mühlbauer "] description = "Allows control of a TC-Helicon GoXLR or GoXLR Mini, by maintaining an interaction with it over USB in the background." @@ -22,6 +22,7 @@ goxlr-scribbles = { path = "../scribbles" } log = "0.4.17" simplelog = "0.12.0" file-rotate = "0.7.4" +log-panics = { version = "2.1.0", features = ["with-backtrace"]} tokio = { version = "1.23.0", features = ["full"] } tokio-serde = "0.8.0" @@ -50,6 +51,9 @@ interprocess = { version = "1.2.1", features = ["tokio_support"] } notify = "5.0.0" json-patch = "0.3.0" +tempfile = "3.7.0" + + ## HTTPd Server actix = "0.13.0" actix-web-actors = "4.2.0" @@ -102,7 +106,6 @@ assets = [ ["../target/release/goxlr-client", "usr/bin/", "755"], ["../target/release/goxlr-defaults", "usr/bin/", "755"], ["../target/release/goxlr-launcher", "usr/bin/", "755"], - ["../target/release/goxlr-firmware", "usr/bin/", "755"], ["../50-goxlr.rules", "etc/udev/rules.d/", "644"], ["../daemon/resources/goxlr-utility.png", "usr/share/icons/hicolor/48x48/apps/", "644"], ["../daemon/resources/goxlr-utility-large.png", "usr/share/pixmaps/goxlr-utility.png", "644"], @@ -122,6 +125,7 @@ depends = "$auto" extended-description = """\ A utility for monitoring and controlling a TC-Helicon GoXLR or GoXLR Mini. """ +revision = "1" ## cargo generate-rpm support.. [package.metadata.generate-rpm] @@ -131,7 +135,6 @@ assets = [ { source = "../target/release/goxlr-client", dest = "/usr/bin/goxlr-client", mode = "0755" }, { source = "../target/release/goxlr-defaults", dest = "/usr/bin/goxlr-defaults", mode = "0755" }, { source = "../target/release/goxlr-launcher", dest = "/usr/bin/goxlr-launcher", mode = "0755" }, - { source = "../target/release/goxlr-firmware", dest = "/usr/bin/goxlr-firmware", mode = "0755" }, { source = "../50-goxlr.rules", dest = "/etc/udev/rules.d/50-goxlr.rules", mode = "0644" }, { source = "../daemon/resources/goxlr-utility.png", dest = "/usr/share/icons/hicolor/48x48/apps/goxlr-utility.png", mode = "0644" }, { source = "../daemon/resources/goxlr-utility-large.png", dest = "/usr/share/pixmaps/goxlr-utility.png", mode = "0644" }, @@ -145,10 +148,10 @@ assets = [ { source = "../deployment/deb/_goxlr-daemon", dest = "/usr/share/zsh/vendor-completions/_goxlr-daemon", mode = "0644" }, ] -# Tiny scriptlet, should reload udev. +# Tiny scriptlet, should reload udev, unless we are running an immutable OS like Fedora Silverblue. post_install_script = """ -udevadm control --reload-rules -udevadm trigger +[[ -f /run/ostree-booted ]] || udevadm control --reload-rules +[[ -f /run/ostree-booted ]] || udevadm trigger """ #release = "1" @@ -163,3 +166,12 @@ auto-req = "no" dbus-libs = ">= 1.9.14" pulseaudio-libs = ">= 10.0" speech-dispatcher = ">= 0.7" + +[package.metadata.generate-rpm.variants.suse] +release = "suse" + +# SuSE has the same general dependencies as anything RHEL +[package.metadata.generate-rpm.variants.suse.requires] +libdbus-1-3 = ">= 1.9.14" +libpulse0 = ">= 10.0" +speech-dispatcher = ">= 0.7" \ No newline at end of file diff --git a/daemon/src/device.rs b/daemon/src/device.rs index 2ec279a9..306218dd 100644 --- a/daemon/src/device.rs +++ b/daemon/src/device.rs @@ -204,6 +204,8 @@ impl<'a> Device<'a> { .get_enable_monitor_with_fx(self.serial()) .await; + let locked_faders = self.settings.get_device_lock_faders(self.serial()).await; + let submix_supported = self.device_supports_submixes(); let mut sample_progress = None; @@ -268,6 +270,7 @@ impl<'a> Device<'a> { mute_hold_duration: self.hold_time, vc_mute_also_mute_cm: self.vc_mute_also_mute_cm, enable_monitor_with_fx: monitor_with_fx, + lock_faders: locked_faders, }, button_down: button_states, profile_name: self.profile.name().to_owned(), @@ -345,7 +348,7 @@ impl<'a> Device<'a> { }; if refresh_colour_map { - self.load_colour_map()?; + self.load_colour_map().await?; } } @@ -547,15 +550,15 @@ impl<'a> Device<'a> { Buttons::SamplerSelectA => { self.load_sample_bank(SampleBank::A).await?; - self.load_colour_map()?; + self.load_colour_map().await?; } Buttons::SamplerSelectB => { self.load_sample_bank(SampleBank::B).await?; - self.load_colour_map()?; + self.load_colour_map().await?; } Buttons::SamplerSelectC => { self.load_sample_bank(SampleBank::C).await?; - self.load_colour_map()?; + self.load_colour_map().await?; } Buttons::SamplerBottomLeft => { @@ -746,7 +749,6 @@ impl<'a> Device<'a> { return Ok(()); } - // This will only ever trigger if called via the API, so don't announce this for now.. if mute_function == MuteFunction::All { // Throw this across to the 'Mute to All' code.. return self.mute_fader_to_all(fader, false).await; @@ -769,6 +771,7 @@ impl<'a> Device<'a> { async fn mute_fader_to_all(&mut self, fader: FaderName, blink: bool) -> Result<()> { let (muted_to_x, muted_to_all, mute_function) = self.profile.get_mute_button_state(fader); let channel = self.profile.get_fader_assignment(fader); + let lock_faders = self.settings.get_device_lock_faders(self.serial()).await; // Are we already muted to all? if muted_to_all { @@ -781,8 +784,14 @@ impl<'a> Device<'a> { // Per the latest official release, the mini no longer sets the volume to 0 on mute if self.hardware.device_type != DeviceType::Mini { + // We need to set the previous volume regardless, because if the below setting + // changes, we need to correctly reset the position. self.profile.set_mute_previous_volume(fader, volume)?; - self.goxlr.set_volume(channel, 0)?; + + if !lock_faders { + // User has asked us not to move the volume, + self.goxlr.set_volume(channel, 0)?; + } } self.goxlr.set_channel_state(channel, Muted)?; self.profile.set_mute_button_on(fader, true)?; @@ -796,9 +805,12 @@ impl<'a> Device<'a> { self.profile.set_mute_button_blink(fader, true)?; } - if self.hardware.device_type != DeviceType::Mini { + if self.hardware.device_type != DeviceType::Mini && !lock_faders { // Again, only apply this if we're a full device self.profile.set_channel_volume(channel, 0)?; + } else { + // Reload the colour map on the mini (will disable fader lighting) + self.load_colour_map().await?; } // If we're Chat, we may need to transiently route the Microphone.. @@ -817,6 +829,7 @@ impl<'a> Device<'a> { async fn unmute_fader(&mut self, fader: FaderName) -> Result<()> { let (muted_to_x, muted_to_all, mute_function) = self.profile.get_mute_button_state(fader); let channel = self.profile.get_fader_assignment(fader); + let lock_faders = self.settings.get_device_lock_faders(self.serial()).await; if !muted_to_x && !muted_to_all { // Nothing to do. @@ -839,17 +852,20 @@ impl<'a> Device<'a> { } // As with mute, the mini doesn't modify volumes on mute / unmute - if self.hardware.device_type != DeviceType::Mini { + if self.hardware.device_type != DeviceType::Mini && !lock_faders { self.goxlr.set_volume(channel, previous_volume)?; self.profile.set_channel_volume(channel, previous_volume)?; - } else if self.device_supports_submixes() - && (channel == ChannelName::Headphones || channel == ChannelName::LineOut) - { - // This is a special case, when calling unmute on submix firmware, the LineOut - // and Headphones don't set correctly, so we need to forcibly restore the - // volume. This does mean unlatching though :( - let current_volume = self.profile.get_channel_volume(channel); - self.goxlr.set_volume(channel, current_volume)?; + } else { + if self.needs_submix_correction(channel) { + // This is a special case, when calling unmute on submix firmware, the LineOut + // and Headphones don't set correctly, so we need to forcibly restore the + // volume. This does mean unlatching though :( + let current_volume = self.profile.get_channel_volume(channel); + self.goxlr.set_volume(channel, current_volume)?; + } + + // Reload the Minis colour Map to re-establish colours. + self.load_colour_map().await?; } // As before, we might need transient Mic Routing.. @@ -876,6 +892,47 @@ impl<'a> Device<'a> { Ok(()) } + fn lock_faders(&mut self) -> Result<()> { + if self.hardware.device_type == DeviceType::Mini { + return Ok(()); + } + + for fader in FaderName::iter() { + if self.profile.get_fader_mute_state(fader) == Muted { + // Ok, to lock the fader, we need to restore this to it's stored value.. + let volume = self.profile.get_mute_button_previous_volume(fader); + let channel = self.profile.get_fader_assignment(fader); + + // Set the volume of the channel back to where it should be + self.goxlr.set_volume(channel, volume)?; + } + } + Ok(()) + } + + fn unlock_faders(&mut self) -> Result<()> { + if self.hardware.device_type == DeviceType::Mini { + return Ok(()); + } + + // We need to drop any muted faders to 0 volume.. + for fader in FaderName::iter() { + if self.profile.get_fader_mute_state(fader) == Muted { + // Get the current volume for the fader.. + let channel = self.profile.get_fader_assignment(fader); + let volume = self.profile.get_channel_volume(channel); + + // Set the previous volume + self.profile.set_mute_previous_volume(fader, volume)?; + + // Set the volume of the channel to 0 + self.goxlr.set_volume(channel, 0)?; + } + } + + Ok(()) + } + fn get_basic_input_from_channel(&self, channel: ChannelName) -> Option { match channel { ChannelName::Mic => Some(BasicInputDevice::Microphone), @@ -930,7 +987,7 @@ impl<'a> Device<'a> { // Because we may have removed the 'last' sample on a button, we need to refresh // the states to make sure everything is correctly updated. - self.load_colour_map()?; + self.load_colour_map().await?; self.update_button_states() } @@ -1061,7 +1118,7 @@ impl<'a> Device<'a> { self.profile.set_sample_clear_active(false)?; debug!("Disabled Buttons.."); - self.load_colour_map()?; + self.load_colour_map().await?; debug!("Reset Colours"); return Ok(()); @@ -1094,7 +1151,7 @@ impl<'a> Device<'a> { } // In all cases, we should stop the colour flashing. self.profile.set_sample_button_blink(button, false)?; - self.load_colour_map()?; + self.load_colour_map().await?; return Ok(()); } @@ -1218,13 +1275,7 @@ impl<'a> Device<'a> { self.load_encoder_effects()?; self.set_pitch_mode()?; - self.apply_effects(self.mic_profile.get_reverb_keyset())?; - self.apply_effects(self.mic_profile.get_megaphone_keyset())?; - self.apply_effects(self.mic_profile.get_robot_keyset())?; - self.apply_effects(self.mic_profile.get_hardtune_keyset())?; - self.apply_effects(self.mic_profile.get_echo_keyset())?; - self.apply_effects(self.mic_profile.get_pitch_keyset())?; - self.apply_effects(self.mic_profile.get_gender_keyset())?; + self.apply_effects(self.mic_profile.get_fx_keys())?; Ok(()) } @@ -1274,16 +1325,7 @@ impl<'a> Device<'a> { self.profile.set_effects(enabled)?; // When this changes, we need to update all the 'Enabled' keys.. - let mut key_updates = LinkedHashSet::new(); - key_updates.insert(EffectKey::Encoder1Enabled); - key_updates.insert(EffectKey::Encoder2Enabled); - key_updates.insert(EffectKey::Encoder3Enabled); - key_updates.insert(EffectKey::Encoder4Enabled); - - key_updates.insert(EffectKey::MegaphoneEnabled); - key_updates.insert(EffectKey::HardTuneEnabled); - key_updates.insert(EffectKey::RobotEnabled); - self.apply_effects(key_updates)?; + self.apply_effects(self.mic_profile.get_enabled_keyset())?; // Re-apply routing to the Mic in case monitoring needs to be enabled / disabled.. self.apply_routing(BasicInputDevice::Microphone).await?; @@ -1473,6 +1515,13 @@ impl<'a> Device<'a> { Ok(value_changed) } + pub async fn get_mic_level(&mut self) -> Result { + let level = self.goxlr.get_microphone_level()?; + + let db = ((f64::log(level.into(), 10.) * 20.) - 72.2).clamp(-72.2, 0.); + Ok(db) + } + pub async fn perform_command(&mut self, command: GoXLRCommand) -> Result<()> { match command { GoXLRCommand::SetShutdownCommands(commands) => { @@ -1669,7 +1718,7 @@ impl<'a> Device<'a> { } self.profile.set_animation_mode(mode)?; - self.load_animation(false)?; + self.load_animation(false).await?; } GoXLRCommand::SetAnimationMod1(value) => { if !self.device_supports_animations() { @@ -1677,7 +1726,7 @@ impl<'a> Device<'a> { } self.profile.set_animation_mod1(value)?; - self.load_animation(false)?; + self.load_animation(false).await?; } GoXLRCommand::SetAnimationMod2(value) => { if !self.device_supports_animations() { @@ -1685,7 +1734,7 @@ impl<'a> Device<'a> { } self.profile.set_animation_mod2(value)?; - self.load_animation(false)?; + self.load_animation(false).await?; } GoXLRCommand::SetAnimationWaterfall(direction) => { if !self.device_supports_animations() { @@ -1693,12 +1742,12 @@ impl<'a> Device<'a> { } self.profile.set_animation_waterfall(direction)?; - self.load_animation(false)?; + self.load_animation(false).await?; } GoXLRCommand::SetGlobalColour(colour) => { self.profile.set_global_colour(colour)?; - self.load_colour_map()?; + self.load_colour_map().await?; self.update_button_states()?; self.set_all_fader_display_from_profile()?; } @@ -1709,7 +1758,7 @@ impl<'a> Device<'a> { GoXLRCommand::SetFaderColours(fader, top, bottom) => { // Need to get the fader colour map, and set values.. self.profile.set_fader_colours(fader, top, bottom)?; - self.load_colour_map()?; + self.load_colour_map().await?; } GoXLRCommand::SetAllFaderColours(top, bottom) => { // I considered this as part of SetFaderColours, but spamming a new colour map @@ -1719,7 +1768,7 @@ impl<'a> Device<'a> { self.profile .set_fader_colours(fader, top.to_owned(), bottom.to_owned())?; } - self.load_colour_map()?; + self.load_colour_map().await?; } GoXLRCommand::SetAllFaderDisplayStyle(display_style) => { for fader in FaderName::iter() { @@ -1732,46 +1781,46 @@ impl<'a> Device<'a> { .set_button_colours(target, colour, colour2.as_ref())?; // Reload the colour map and button states.. - self.load_colour_map()?; + self.load_colour_map().await?; self.update_button_states()?; } GoXLRCommand::SetButtonOffStyle(target, off_style) => { self.profile.set_button_off_style(target, off_style)?; - self.load_colour_map()?; + self.load_colour_map().await?; self.update_button_states()?; } GoXLRCommand::SetButtonGroupColours(target, colour, colour_2) => { self.profile .set_group_button_colours(target, colour, colour_2)?; - self.load_colour_map()?; + self.load_colour_map().await?; self.update_button_states()?; } GoXLRCommand::SetButtonGroupOffStyle(target, off_style) => { self.profile.set_group_button_off_style(target, off_style)?; - self.load_colour_map()?; + self.load_colour_map().await?; self.update_button_states()?; } GoXLRCommand::SetSimpleColour(target, colour) => { self.profile.set_simple_colours(target, colour)?; - self.load_colour_map()?; + self.load_colour_map().await?; self.update_button_states()?; } GoXLRCommand::SetEncoderColour(target, colour, colour_2, colour_3) => { self.profile .set_encoder_colours(target, colour, colour_2, colour_3)?; - self.load_colour_map()?; + self.load_colour_map().await?; } GoXLRCommand::SetSampleColour(target, colour, colour_2, colour_3) => { self.profile .set_sampler_colours(target, colour, colour_2, colour_3)?; self.profile.sync_sample_if_active(target)?; - self.load_colour_map()?; + self.load_colour_map().await?; } GoXLRCommand::SetSampleOffStyle(target, style) => { self.profile.set_sampler_off_style(target, style)?; - self.load_colour_map()?; + self.load_colour_map().await?; self.update_button_states()?; } @@ -1968,6 +2017,9 @@ impl<'a> Device<'a> { // will still return it's 'Wide' value during polls which error out otherwise. let value = self.profile.get_pitch_encoder_position(); self.goxlr.set_encoder_value(EncoderName::Pitch, value)?; + + // Update the pitch 'Threshold' value which may have changed.. + self.apply_effects(LinkedHashSet::from_iter([EffectKey::PitchThreshold]))?; } GoXLRCommand::SetPitchAmount(value) => { let hard_tune_enabled = self.profile.is_hardtune_enabled(true); @@ -2178,7 +2230,7 @@ impl<'a> Device<'a> { } // Update the lighting.. - self.load_colour_map()?; + self.load_colour_map().await?; } GoXLRCommand::SetSampleStartPercent(bank, button, index, percent) => { self.profile @@ -2194,7 +2246,7 @@ impl<'a> Device<'a> { .remove_sample_file_by_index(bank, button, index)?; if remaining == 0 { - self.load_colour_map()?; + self.load_colour_map().await?; } } GoXLRCommand::PlaySampleByIndex(bank, button, index) => { @@ -2280,9 +2332,9 @@ impl<'a> Device<'a> { self.profile.load_colour_profile(profile); if self.device_supports_animations() { - self.load_animation(false)?; + self.load_animation(false).await?; } else { - self.load_colour_map()?; + self.load_colour_map().await?; } self.update_button_states()?; } @@ -2404,13 +2456,32 @@ impl<'a> Device<'a> { self.apply_routing(BasicInputDevice::Microphone).await?; } + GoXLRCommand::SetLockFaders(value) => { + let current = self.settings.get_device_lock_faders(self.serial()).await; + + if current != value { + self.settings + .set_device_lock_faders(self.serial(), value) + .await; + + self.settings.save().await; + + if value { + self.lock_faders()?; + } else { + self.unlock_faders()?; + } + self.load_colour_map().await?; + } + } + GoXLRCommand::SetActiveEffectPreset(preset) => { self.load_effect_bank(preset).await?; self.update_button_states()?; } GoXLRCommand::SetActiveSamplerBank(bank) => { self.load_sample_bank(bank).await?; - self.load_colour_map()?; + self.load_colour_map().await?; } GoXLRCommand::SetMegaphoneEnabled(enabled) => { self.set_megaphone(enabled).await?; @@ -2591,9 +2662,10 @@ impl<'a> Device<'a> { // to ensure that if we're handling the mic, we handle it here. if channel_name == ChannelName::Mic { self.apply_transient_chat_mic_mute(router)?; + self.apply_transient_cough_routing(router)?; } - self.apply_transient_cough_routing(channel_name, router) + Ok(()) } fn apply_transient_fader_routing( @@ -2614,7 +2686,6 @@ impl<'a> Device<'a> { fn apply_transient_cough_routing( &self, - channel_name: ChannelName, router: &mut EnumMap, ) -> Result<()> { // Same deal, pull out the current state, make needed changes. @@ -2622,7 +2693,7 @@ impl<'a> Device<'a> { self.profile.get_mute_chat_button_state(); self.apply_transient_channel_routing( - channel_name, + ChannelName::Mic, muted_to_x, muted_to_all, mute_function, @@ -2920,12 +2991,17 @@ impl<'a> Device<'a> { Ok(()) } - fn load_colour_map(&mut self) -> Result<()> { + async fn load_colour_map(&mut self) -> Result<()> { // The new colour format occurred on different firmware versions depending on device, // so do the check here. + let device_mini = self.hardware.device_type == DeviceType::Mini; + let lock_faders = self.settings.get_device_lock_faders(self.serial()).await; + + let blank_mute = device_mini || lock_faders; + let use_1_3_40_format = self.device_supports_animations(); - let colour_map = self.profile.get_colour_map(use_1_3_40_format); + let colour_map = self.profile.get_colour_map(use_1_3_40_format, blank_mute); if use_1_3_40_format { self.goxlr.set_button_colours_1_3_40(colour_map)?; @@ -2938,7 +3014,7 @@ impl<'a> Device<'a> { Ok(()) } - fn load_animation(&mut self, map_set: bool) -> Result<()> { + async fn load_animation(&mut self, map_set: bool) -> Result<()> { let enabled = self.profile.get_animation_mode() != goxlr_types::AnimationMode::None; // This one is kinda weird, we go from profile -> types -> usb.. @@ -2967,7 +3043,7 @@ impl<'a> Device<'a> { || mode == AnimationMode::Ripple || mode == AnimationMode::Simple) { - self.load_colour_map()?; + self.load_colour_map().await?; } Ok(()) @@ -3047,11 +3123,11 @@ impl<'a> Device<'a> { self.load_submix_settings(true)?; debug!("Loading Colour Map.."); - self.load_colour_map()?; + self.load_colour_map().await?; if self.device_supports_animations() { // Load any animation settings.. - self.load_animation(true)?; + self.load_animation(true).await?; } debug!("Setting Fader display modes.."); @@ -3378,6 +3454,11 @@ impl<'a> Device<'a> { Ok(()) } + fn needs_submix_correction(&self, channel: ChannelName) -> bool { + self.device_supports_submixes() + && (channel == ChannelName::Headphones || channel == ChannelName::LineOut) + } + fn device_supports_submixes(&self) -> bool { match self.hardware.device_type { DeviceType::Unknown => false, diff --git a/daemon/src/events.rs b/daemon/src/events.rs index 8ab4e97d..a4e92f35 100644 --- a/daemon/src/events.rs +++ b/daemon/src/events.rs @@ -83,12 +83,12 @@ pub async fn spawn_event_handler( PathTypes::Icons => state.settings_handle.get_icons_directory().await, PathTypes::Logs => state.settings_handle.get_log_directory().await, }) { - warn!("Error Opening Path: {}", error); + warn!("Error Opening Path: {:?}", error); }; }, EventTriggers::OpenUi => { if let Err(error) = opener::open(get_util_url(&state)) { - warn!("Error Opening URL: {}", error); + warn!("Error Opening URL: {:?}", error); } }, EventTriggers::Activate => { @@ -114,14 +114,14 @@ pub async fn spawn_event_handler( if let Err(error) = result { warn!("Error Executing command: {:?}, falling back", error); if let Err(error) = opener::open(url) { - warn!("Error Opening URL: {}", error); + warn!("Error Opening URL: {:?}", error); } } } }, None => { if let Err(error) = opener::open(url) { - warn!("Error Opening URL: {}", error); + warn!("Error Opening URL: {:?}", error); } } } @@ -144,17 +144,17 @@ pub async fn spawn_event_handler( if let Err(error) = result { warn!("Error Executing command: {:?}, falling back", error); if let Err(error) = opener::open(url) { - warn!("Error Opening URL: {}", error); + warn!("Error Opening URL: {:?}", error); } } } else if let Err(error) = opener::open(url) { - warn!("Error Opening URL: {}", error); + warn!("Error Opening URL: {:?}", error); } }, None => { if let Err(error) = opener::open(url) { - warn!("Error Opening URL: {}", error); + warn!("Error Opening URL: {:?}", error); } } } diff --git a/daemon/src/files.rs b/daemon/src/files.rs index 2b4c3f51..b1522c80 100644 --- a/daemon/src/files.rs +++ b/daemon/src/files.rs @@ -357,7 +357,7 @@ pub fn create_path(path: &Path) -> Result<()> { if !path.exists() { // Attempt to create the profile directory.. if let Err(e) = create_dir_all(path) { - return Err(e).context(format!("Could not create path {}", &path.to_string_lossy()))?; + Err(e).context(format!("Could not create path {}", &path.to_string_lossy()))?; } else { info!("Created Path: {}", path.to_string_lossy()); } diff --git a/daemon/src/main.rs b/daemon/src/main.rs index 20fa036f..76d73484 100644 --- a/daemon/src/main.rs +++ b/daemon/src/main.rs @@ -98,6 +98,8 @@ async fn main() -> Result<()> { // it's only useful in a development setting! config.add_filter_ignore_str("symphonia"); + let timezone_calculated = config.set_time_offset_to_local().is_ok(); + // Create a file rotator, that will compress and rotate files after 5Mb let file_rotator = FileRotate::new( log_file, @@ -141,6 +143,13 @@ async fn main() -> Result<()> { ]) .context("Could not configure the logger")?; + // Enable the PANIC logger.. + log_panics::init(); + + if !timezone_calculated { + warn!("Unable to calculate timezone, using UTC for log timestamps"); + } + if is_root() { if args.force_root { error!("GoXLR Utility running as root, this is generally considered bad."); diff --git a/daemon/src/mic_profile.rs b/daemon/src/mic_profile.rs index e1418cd7..100f8879 100644 --- a/daemon/src/mic_profile.rs +++ b/daemon/src/mic_profile.rs @@ -1134,6 +1134,10 @@ impl MicProfileAdapter { keys.extend(self.get_echo_keyset()); keys.extend(self.get_pitch_keyset()); keys.extend(self.get_gender_keyset()); + keys.extend(self.get_enabled_keyset()); + + // Make sure the Mic Mute State key is handled.. + keys.insert(EffectKey::MicInputMute); keys } @@ -1194,7 +1198,6 @@ impl MicProfileAdapter { pub fn get_megaphone_keyset(&self) -> LinkedHashSet { let mut set = LinkedHashSet::new(); - set.insert(EffectKey::MegaphoneEnabled); set.insert(EffectKey::MegaphoneStyle); set.insert(EffectKey::MegaphoneAmount); set.insert(EffectKey::MegaphoneHP); @@ -1216,7 +1219,6 @@ impl MicProfileAdapter { pub fn get_robot_keyset(&self) -> LinkedHashSet { let mut set = LinkedHashSet::new(); - set.insert(EffectKey::RobotEnabled); set.insert(EffectKey::RobotPulseWidth); set.insert(EffectKey::RobotWaveform); set.insert(EffectKey::RobotThreshold); @@ -1237,7 +1239,6 @@ impl MicProfileAdapter { pub fn get_hardtune_keyset(&self) -> LinkedHashSet { let mut set = LinkedHashSet::new(); - set.insert(EffectKey::HardTuneEnabled); set.insert(EffectKey::HardTuneKeySource); set.insert(EffectKey::HardTuneAmount); set.insert(EffectKey::HardTuneWindow); @@ -1248,6 +1249,20 @@ impl MicProfileAdapter { set } + pub fn get_enabled_keyset(&self) -> LinkedHashSet { + let mut set = LinkedHashSet::new(); + set.insert(EffectKey::Encoder1Enabled); + set.insert(EffectKey::Encoder2Enabled); + set.insert(EffectKey::Encoder3Enabled); + set.insert(EffectKey::Encoder4Enabled); + + set.insert(EffectKey::MegaphoneEnabled); + set.insert(EffectKey::HardTuneEnabled); + set.insert(EffectKey::RobotEnabled); + + set + } + pub fn get_deesser(&self) -> u8 { self.profile.deess() } diff --git a/daemon/src/primary_worker.rs b/daemon/src/primary_worker.rs index 58faa6c4..41d42bf7 100644 --- a/daemon/src/primary_worker.rs +++ b/daemon/src/primary_worker.rs @@ -28,6 +28,7 @@ pub enum DeviceCommand { SendDaemonStatus(oneshot::Sender), RunDaemonCommand(DaemonCommand, oneshot::Sender>), RunDeviceCommand(String, GoXLRCommand, oneshot::Sender>), + GetDeviceMicLevel(String, oneshot::Sender>), } pub type DeviceSender = Sender; @@ -231,6 +232,14 @@ pub async fn spawn_usb_handler( let _ = sender.send(Err(anyhow!("Device {} is not connected", serial))); } }, + + DeviceCommand::GetDeviceMicLevel(serial, sender) => { + if let Some(device) = devices.get_mut(&serial) { + let _ = sender.send(device.get_mic_level().await); + } else { + let _ = sender.send(Err(anyhow!("Device {} is not connected", serial))); + } + } } }, Some(path) = file_rx.recv() => { diff --git a/daemon/src/profile.rs b/daemon/src/profile.rs index c83cb502..8056f49f 100644 --- a/daemon/src/profile.rs +++ b/daemon/src/profile.rs @@ -201,17 +201,22 @@ impl ProfileAdapter { fn get_channel_mute_state(&self, channel: ChannelName) -> ChannelState { // Is this assigned to a fader? if let Some(fader) = self.get_fader_from_channel(channel) { - let (muted_to_x, muted_to_all, mute_function) = self.get_mute_button_state(fader); - - if muted_to_all || (muted_to_x && mute_function == MuteFunction::All) { - return ChannelState::Muted; - } + return self.get_fader_mute_state(fader); } // Not assigned, always unmuted ChannelState::Unmuted } + pub fn get_fader_mute_state(&self, fader: FaderName) -> ChannelState { + let (muted_to_x, muted_to_all, mute_function) = self.get_mute_button_state(fader); + + if muted_to_all || (muted_to_x && mute_function == MuteFunction::All) { + return ChannelState::Muted; + } + ChannelState::Unmuted + } + pub fn create_router(&self) -> EnumMap> { // Create the main EnumMap.. let mut router: EnumMap> = EnumMap::default(); @@ -493,7 +498,7 @@ impl ProfileAdapter { .set_channel_volume(standard_to_profile_channel(channel), volume) } - pub fn get_colour_map(&self, use_format_1_3_40: bool) -> [u8; 520] { + pub fn get_colour_map(&self, use_format_1_3_40: bool, blank_mute: bool) -> [u8; 520] { let mut colour_array = [0; 520]; for colour in ColourTargets::iter() { @@ -513,6 +518,18 @@ impl ProfileAdapter { colour_array[position..position + 4] .copy_from_slice(&self.get_sampler_lighting(colour, i)); } + ColourTargets::FadeMeter1 + | ColourTargets::FadeMeter2 + | ColourTargets::FadeMeter3 + | ColourTargets::FadeMeter4 => { + let array = if blank_mute { + self.get_fader_lighting(colour, i) + } else { + colour_map.colour(i).to_reverse_bytes() + }; + colour_array[position..position + 4].copy_from_slice(&array); + } + _ => { // Update the correct 4 bytes in the map.. colour_array[position..position + 4] @@ -527,17 +544,41 @@ impl ProfileAdapter { fn get_sampler_lighting(&self, target: ColourTargets, index: u8) -> [u8; 4] { match target { - ColourTargets::SamplerBottomLeft => self.get_colour_array(target, BottomLeft, index), - ColourTargets::SamplerBottomRight => self.get_colour_array(target, BottomRight, index), - ColourTargets::SamplerTopLeft => self.get_colour_array(target, TopLeft, index), - ColourTargets::SamplerTopRight => self.get_colour_array(target, TopRight, index), + ColourTargets::SamplerBottomLeft => { + self.get_sample_colour_array(target, BottomLeft, index) + } + ColourTargets::SamplerBottomRight => { + self.get_sample_colour_array(target, BottomRight, index) + } + ColourTargets::SamplerTopLeft => self.get_sample_colour_array(target, TopLeft, index), + ColourTargets::SamplerTopRight => self.get_sample_colour_array(target, TopRight, index), // Honestly, we should never reach this, return nothing. _ => [00, 00, 00, 00], } } - fn get_colour_array(&self, target: ColourTargets, button: SampleButtons, index: u8) -> [u8; 4] { + fn get_fader_lighting(&self, target: ColourTargets, index: u8) -> [u8; 4] { + // This is a little roundabout, I could probably skip the channel lookup.. + let fader = map_colour_target_to_fader(target); + let state = self.get_fader_mute_state(fader); + + match state { + ChannelState::Muted => [00, 00, 00, 00], + ChannelState::Unmuted => { + // Return the default colour. + let map = get_profile_colour_map(self.profile.settings(), target); + map.colour(index).to_reverse_bytes() + } + } + } + + fn get_sample_colour_array( + &self, + target: ColourTargets, + button: SampleButtons, + index: u8, + ) -> [u8; 4] { if self.current_sample_bank_has_samples(profile_to_standard_sample_button(button)) { return get_profile_colour_map(self.profile.settings(), target) .colour(index) @@ -2813,6 +2854,17 @@ fn map_fader_to_colour_target(fader: FaderName) -> ColourTargets { } } +fn map_colour_target_to_fader(fader: ColourTargets) -> FaderName { + match fader { + ColourTargets::FadeMeter1 => FaderName::A, + ColourTargets::FadeMeter2 => FaderName::B, + ColourTargets::FadeMeter3 => FaderName::C, + ColourTargets::FadeMeter4 => FaderName::D, + + _ => FaderName::A, + } +} + fn map_sample_bank_to_colour_target(bank: SampleBank) -> ColourTargets { match bank { SampleBank::A => ColourTargets::SamplerSelectA, diff --git a/daemon/src/servers/http_server.rs b/daemon/src/servers/http_server.rs index 3c48d4c5..4d9aac25 100644 --- a/daemon/src/servers/http_server.rs +++ b/daemon/src/servers/http_server.rs @@ -120,6 +120,12 @@ impl StreamHandler> for Websocket { data: DaemonResponse::Status(status), })); } + DaemonResponse::MicLevel(level) => { + recipient.do_send(WsResponse(WebsocketResponse { + id: request_id, + data: DaemonResponse::MicLevel(level), + })) + } _ => {} }, Err(error) => { diff --git a/daemon/src/servers/server_packet.rs b/daemon/src/servers/server_packet.rs index 64334ada..b5234dfb 100644 --- a/daemon/src/servers/server_packet.rs +++ b/daemon/src/servers/server_packet.rs @@ -31,6 +31,24 @@ pub async fn handle_packet( .context("Could not execute the command on the GoXLR device")??; Ok(DaemonResponse::Ok) } + DaemonRequest::GetMicLevel(serial) => { + let (tx, rx) = oneshot::channel(); + usb_tx + .send(DeviceCommand::GetDeviceMicLevel(serial, tx)) + .await + .map_err(|e| anyhow!(e.to_string())) + .map_err(|e| anyhow!(e.to_string())) + .context("Could not communicate with the GoXLR device")?; + let result = rx + .await + .context("Could not execute the command on the GoXLR device")?; + + match result { + Ok(value) => Ok(DaemonResponse::MicLevel(value)), + Err(e) => Ok(DaemonResponse::Error(e.to_string())), + } + } + DaemonRequest::Command(serial, command) => { let (tx, rx) = oneshot::channel(); usb_tx diff --git a/daemon/src/settings.rs b/daemon/src/settings.rs index 80451edd..4c3dedd0 100644 --- a/daemon/src/settings.rs +++ b/daemon/src/settings.rs @@ -3,9 +3,10 @@ use crate::profile::DEFAULT_PROFILE_NAME; use anyhow::{Context, Result}; use directories::ProjectDirs; use goxlr_ipc::{GoXLRCommand, LogLevel}; -use log::error; +use log::{debug, error}; use serde::{Deserialize, Serialize}; use std::collections::HashMap; +use std::fs; use std::fs::{create_dir_all, File}; use std::io::ErrorKind; use std::path::{Path, PathBuf}; @@ -274,6 +275,21 @@ impl SettingsHandle { true } + pub async fn get_device_lock_faders(&self, device_serial: &str) -> bool { + let settings = self.settings.read().await; + let value = settings + .devices + .as_ref() + .unwrap() + .get(device_serial) + .map(|d| d.lock_faders.unwrap_or(true)); + + if let Some(value) = value { + return value; + } + true + } + pub async fn get_enable_monitor_with_fx(&self, device_serial: &str) -> bool { let settings = self.settings.read().await; let value = settings @@ -358,6 +374,17 @@ impl SettingsHandle { entry.chat_mute_mutes_mic_to_chat = Some(setting); } + pub async fn set_device_lock_faders(&self, device_serial: &str, setting: bool) { + let mut settings = self.settings.write().await; + let entry = settings + .devices + .as_mut() + .unwrap() + .entry(device_serial.to_owned()) + .or_insert_with(DeviceSettings::default); + entry.lock_faders = Some(setting); + } + pub async fn set_enable_monitor_with_fx(&self, device_serial: &str, setting: bool) { let mut settings = self.settings.write().await; let entry = settings @@ -389,10 +416,25 @@ pub struct Settings { impl Settings { pub fn read(path: &Path) -> Result> { match File::open(path) { - Ok(reader) => Ok(Some(serde_json::from_reader(reader).context(format!( - "Could not parse daemon settings file at {}", - path.to_string_lossy() - ))?)), + Ok(reader) => { + let settings = serde_json::from_reader(reader); + + match settings { + Ok(settings) => Ok(Some(settings)), + Err(_) => { + // Something's gone wrong loading the settings, rather than immediately + // exiting, we'll try to backup the original file, and reload the defaults. + let mut backup = PathBuf::from(path); + backup.set_extension(".failed"); + + let copy_result = fs::copy(path, backup); + println!("{:?}", copy_result); + + println!("Error Loading configuration, loading defaults."); + Ok(None) + } + } + } Err(error) if error.kind() == ErrorKind::NotFound => Ok(None), Err(error) => Err(error).context(format!( "Could not open daemon settings file for reading at {}", @@ -402,6 +444,7 @@ impl Settings { } pub fn write(&self, path: &Path) -> Result<()> { + debug!("Saving Settings"); if let Some(parent) = path.parent() { if let Err(e) = create_dir_all(parent) { if e.kind() != ErrorKind::AlreadyExists { @@ -412,14 +455,23 @@ impl Settings { } } } - let writer = File::create(path).context(format!( - "Could not open daemon settings file for writing at {}", - path.to_string_lossy() - ))?; - serde_json::to_writer_pretty(writer, self).context(format!( - "Could not write to daemon settings file at {}", - path.to_string_lossy() - ))?; + + let temp_file = tempfile::NamedTempFile::new()?; + + debug!("Writing Config to Temporary File: {:?}", temp_file.path()); + serde_json::to_writer_pretty(temp_file.as_file(), self)?; + + // Sync the file written to disk.. + debug!("Syncing Disk.."); + temp_file.as_file().sync_all()?; + + debug!("Write Complete, saving to {:?}", path); + fs::copy(temp_file.path(), path)?; + + debug!("Removing Temporary File.."); + fs::remove_file(temp_file.path())?; + + debug!("Settings Saved."); Ok(()) } } @@ -436,6 +488,9 @@ struct DeviceSettings { // 'Voice Chat Mute All Also Mutes Mic to Chat Mic' O_O chat_mute_mutes_mic_to_chat: Option, + // Disables the Movement of the Faders when Muting to All (full device only) + lock_faders: Option, + // Enable Monitoring when FX are Enabled enable_monitor_with_fx: Option, @@ -452,6 +507,7 @@ impl Default for DeviceSettings { hold_delay: Some(500), sampler_pre_buffer: None, chat_mute_mutes_mic_to_chat: Some(true), + lock_faders: Some(false), enable_monitor_with_fx: Some(false), shutdown_commands: vec![], diff --git a/daemon/src/tray/windows.rs b/daemon/src/tray/windows.rs index 2f00f66a..a96d064b 100644 --- a/daemon/src/tray/windows.rs +++ b/daemon/src/tray/windows.rs @@ -5,8 +5,8 @@ use std::thread::sleep; use std::time::Duration; use anyhow::{bail, Result}; -use goxlr_ipc::PathTypes; -use log::{debug, warn}; +use lazy_static::lazy_static; +use log::{debug, error, warn}; use tokio::sync::mpsc::Sender; use win_win::{WindowBuilder, WindowClass, WindowProc}; use winapi::shared::guiddef::GUID; @@ -14,12 +14,14 @@ use winapi::shared::minwindef::{DWORD, FALSE, HINSTANCE, LPARAM, LRESULT, UINT, use winapi::shared::windef::{HBRUSH, HICON, HMENU, HWND, POINT}; use winapi::um::shellapi::{NIF_ICON, NIF_MESSAGE, NIF_TIP, NIM_ADD, NIM_DELETE, NOTIFYICONDATAW}; use winapi::um::winuser::{ - AppendMenuW, CreateIcon, DestroyWindow, DispatchMessageW, GetMessageW, SetTimer, - ShutdownBlockReasonCreate, ShutdownBlockReasonDestroy, TranslateMessage, MENUINFO, MF_POPUP, - MF_SEPARATOR, MF_STRING, MIM_APPLYTOSUBMENUS, MIM_STYLE, MNS_NOTIFYBYPOS, WM_USER, + AppendMenuW, CreateIcon, DestroyWindow, DispatchMessageW, GetMessageW, RegisterWindowMessageW, + SetTimer, ShutdownBlockReasonCreate, ShutdownBlockReasonDestroy, TranslateMessage, MENUINFO, + MF_POPUP, MF_SEPARATOR, MF_STRING, MIM_APPLYTOSUBMENUS, MIM_STYLE, MNS_NOTIFYBYPOS, WM_USER, }; use winapi::um::{shellapi, winuser}; +use goxlr_ipc::PathTypes; + use crate::events::EventTriggers::Open; use crate::events::{DaemonState, EventTriggers}; use crate::platform::to_wide; @@ -27,6 +29,11 @@ use crate::tray::get_icon_from_global; const EVENT_MESSAGE: u32 = WM_USER + 1; +lazy_static! { + static ref RESPAWN: UINT = + unsafe { RegisterWindowMessageW(to_wide("TaskbarCreated").as_ptr()) }; +} + pub fn handle_tray(state: DaemonState, tx: Sender) -> Result<()> { debug!("Spawning Windows Tray.."); @@ -37,13 +44,12 @@ pub fn handle_tray(state: DaemonState, tx: Sender) -> Result<()> } fn create_window(state: DaemonState, tx: Sender) -> Result<()> { // To save some headaches, this is *ALL* unsafe! + debug!("Creating Window for Tray"); unsafe { - // Load up the icon.. - let icon = load_icon()?; - // Use win_win to setup our Window.. let win_class = WindowClass::builder("goxlr-utility").build().unwrap(); + debug!("Creating SubMenu"); let sub = winuser::CreatePopupMenu(); AppendMenuW(sub, MF_STRING, 10, to_wide("Profiles").as_ptr()); AppendMenuW(sub, MF_STRING, 11, to_wide("Mic Profiles").as_ptr()); @@ -55,6 +61,7 @@ fn create_window(state: DaemonState, tx: Sender) -> Result<()> { AppendMenuW(sub, MF_STRING, 17, to_wide("Logs").as_ptr()); // Create the Main Menu.. + debug!("Creating Main Menu.."); let hmenu = winuser::CreatePopupMenu(); AppendMenuW(hmenu, MF_STRING, 0, to_wide("Configure GoXLR").as_ptr()); AppendMenuW(hmenu, MF_SEPARATOR, 1, null_mut()); @@ -62,33 +69,17 @@ fn create_window(state: DaemonState, tx: Sender) -> Result<()> { AppendMenuW(hmenu, MF_SEPARATOR, 3, null_mut()); AppendMenuW(hmenu, MF_STRING, 4, to_wide("Quit").as_ptr()); + debug!("Generating Window Proc"); let window_proc = GoXLRWindowProc::new(state.clone(), tx, hmenu); + + debug!("Getting HWND"); let hwnd = WindowBuilder::new(window_proc, &win_class) .name("GoXLR Utility") .size(20, 20) .build(); - // Create the notification tray item.. - let mut tray_item = get_notification_struct(&hwnd); - tray_item.szTip = tooltip("GoXLR Utility"); - tray_item.hIcon = icon; - tray_item.uFlags = NIF_MESSAGE | NIF_TIP | NIF_ICON; - tray_item.uCallbackMessage = EVENT_MESSAGE; - - if state.show_tray.load(Ordering::Relaxed) - && shellapi::Shell_NotifyIconW(NIM_ADD, &mut tray_item as *mut NOTIFYICONDATAW) == 0 - { - bail!("Unable to Create Tray Icon"); - } - // Make sure the window is spawned hidden, begin our main loop. + debug!("Beginning Tray Runtime Loop"); run_loop(hwnd, state.clone()); - - // If we get here, the loop is done, remove our tray icon. - if state.show_tray.load(Ordering::Relaxed) - && shellapi::Shell_NotifyIconW(NIM_DELETE, &mut tray_item as *mut NOTIFYICONDATAW) == 0 - { - bail!("Unable to remove Tray Icon!"); - } } Ok(()) @@ -98,6 +89,7 @@ fn run_loop(msg_window: HWND, state: DaemonState) { // Because we need to keep track of other things here, we're going to use PeekMessageW rather // than GetMessageW, then use WaitForSingleObject with a timeout to keep the loop looping. + debug!("Running Main Window Loop"); // Turns out, WaitForSingleObject doesn't work for window HWNDs.. unsafe { // Send a message to the window to be be processed 20ms after we hit here.. @@ -126,6 +118,7 @@ fn run_loop(msg_window: HWND, state: DaemonState) { } fn load_icon() -> Result { + debug!("Loading Tray Icon"); let (rgba, width, height) = get_icon_from_global(); let count = rgba.len() / 4; @@ -167,7 +160,54 @@ impl GoXLRWindowProc { } } + fn create_tray(&self, hwnd: HWND) -> Option { + if let Ok(icon) = load_icon() { + debug!("Generating Tray Item"); + let mut tray_item = get_notification_struct(&hwnd); + tray_item.szTip = tooltip("GoXLR Utility"); + tray_item.hIcon = icon; + tray_item.uFlags = NIF_MESSAGE | NIF_TIP | NIF_ICON; + tray_item.uCallbackMessage = EVENT_MESSAGE; + + return Some(tray_item); + } + None + } + + fn create_icon(&self, hwnd: HWND) { + if !self.state.show_tray.load(Ordering::Relaxed) { + debug!("Tray Disabled, doing nothing."); + return; + } + + debug!("Calling Tray Spawner"); + self.spawn_tray(hwnd, NIM_ADD); + } + + fn destroy_icon(&self, hwnd: HWND) { + if !self.state.show_tray.load(Ordering::Relaxed) { + return; + } + debug!("Destroying Tray Icon"); + self.spawn_tray(hwnd, NIM_DELETE); + } + + fn spawn_tray(&self, hwnd: HWND, action: DWORD) { + debug!("Creating Tray Handler"); + if let Some(mut tray) = self.create_tray(hwnd) { + let tray = &mut tray as *mut NOTIFYICONDATAW; + + unsafe { + debug!("Performing Tray Action"); + if shellapi::Shell_NotifyIconW(action, tray) == 0 { + error!("Unable to Load Tray Icon"); + } + } + } + } + fn create_menu(&self) { + debug!("Creating Menu"); let m = MENUINFO { cbSize: mem::size_of::() as DWORD, fMask: MIM_APPLYTOSUBMENUS | MIM_STYLE, @@ -178,6 +218,7 @@ impl GoXLRWindowProc { dwMenuData: 0, }; unsafe { + debug!("Setting Menu Info"); if winuser::SetMenuInfo(self.menu, &m as *const MENUINFO) == 0 { warn!("Error Setting Up Menu."); } @@ -195,15 +236,14 @@ impl WindowProc for GoXLRWindowProc { ) -> Option { match msg { winuser::WM_CREATE => { + debug!("Window Created, Spawn icon and Menu"); + // Window has spawned, Create our Menu :) - debug!("Window Spawned, creating menu.."); + self.create_icon(hwnd); self.create_menu(); } // Menu Related Commands.. winuser::WM_MENUCOMMAND => unsafe { - if lparam as HMENU == self.menu { - debug!("Top Menu?"); - } let menu_id = winuser::GetMenuItemID(lparam as HMENU, wparam as i32) as i32; let _ = match menu_id { // Main Menu @@ -258,6 +298,11 @@ impl WindowProc for GoXLRWindowProc { } } + winuser::WM_DESTROY => { + debug!("Windows Destroyed, killing Tray Icon"); + self.destroy_icon(hwnd); + } + // Window Handler winuser::WM_CLOSE => { // If something tries to close this hidden window, it's a good bet that it wants @@ -316,7 +361,12 @@ impl WindowProc for GoXLRWindowProc { winuser::WM_ENDSESSION => { debug!("Received WM_ENDSESSION from Windows (IGNORED)"); } - _ => {} + _ => { + if msg == *RESPAWN { + debug!("Icon respawn requested: {}", msg); + self.create_icon(hwnd); + } + } } None } diff --git a/daemon/web-content/css/app.2851e982.css b/daemon/web-content/css/app.3a461c46.css similarity index 100% rename from daemon/web-content/css/app.2851e982.css rename to daemon/web-content/css/app.3a461c46.css diff --git a/daemon/web-content/index.html b/daemon/web-content/index.html index 5c7440ef..459bb970 100644 --- a/daemon/web-content/index.html +++ b/daemon/web-content/index.html @@ -1,4 +1,4 @@ -GoXLR Utility
\r\n\r\n\r\n","\r\n\r\n\r\n\r\n\r\n","//this component is to show the notifications\r\n\r\n","import { reactive } from \"vue\";\r\nimport { applyOperation } from \"fast-json-patch\";\r\n\r\n\r\nexport const store = reactive({\r\n has_disconnected: false,\r\n have_device: false,\r\n active: true,\r\n activeSerial: \"\",\r\n\r\n pausedPaths: [],\r\n\r\n // Set a 'base' status struct..\r\n status: {\r\n \"mixers\": {},\r\n \"files\": {}\r\n },\r\n a11y: {\r\n notifications: {\r\n enabled: true,\r\n assertive: \"\",\r\n polite: \"\"\r\n }\r\n },\r\n\r\n socketDisconnected() {\r\n this.has_disconnected = true;\r\n this.activeSerial = \"\";\r\n this.status = {\r\n \"mixers\": {},\r\n \"files\": {}\r\n };\r\n\r\n this.has_disconnected = true;\r\n },\r\n\r\n daemonVersion() {\r\n if (this.status !== undefined) {\r\n if (this.status.config !== undefined) {\r\n return this.status.config.daemon_version;\r\n }\r\n return undefined;\r\n } else {\r\n return undefined;\r\n }\r\n },\r\n\r\n isConnected() {\r\n return !this.has_disconnected;\r\n },\r\n\r\n getConfig() {\r\n return this.status.config;\r\n },\r\n\r\n getVersion() {\r\n return this.status.config.daemon_version;\r\n },\r\n\r\n getDeviceCount() {\r\n return Object.keys(this.status.mixers).length;\r\n },\r\n\r\n setActiveSerial(serial) {\r\n this.activeSerial = serial;\r\n },\r\n\r\n getActiveDevice() {\r\n if (this.activeSerial === \"\") {\r\n return undefined;\r\n }\r\n return this.status.mixers[this.activeSerial];\r\n },\r\n\r\n hasActiveDevice() {\r\n return this.activeSerial !== \"\";\r\n },\r\n\r\n getActiveSerial() {\r\n return this.activeSerial;\r\n },\r\n\r\n getProfileFiles() {\r\n return this.status.files.profiles;\r\n },\r\n\r\n getMicProfileFiles() {\r\n return this.status.files.mic_profiles;\r\n },\r\n\r\n getPresetFiles() {\r\n return this.status.files.presets;\r\n },\r\n\r\n getSampleFiles() {\r\n return this.status.files.samples;\r\n },\r\n\r\n getIconFiles() {\r\n return this.status.files.icons;\r\n },\r\n\r\n replaceData(json) {\r\n if (this.active) {\r\n Object.assign(this.status, json.Status);\r\n this.have_device = true;\r\n this.validateActive();\r\n }\r\n },\r\n\r\n pausePatchPath(path) {\r\n if (path === undefined) {\r\n console.error(\"Attempted to Stop Patches for Undefined!\");\r\n return;\r\n }\r\n let paths = path.split(\";\");\r\n for (path of paths) {\r\n console.log(\"Pausing Path: \" + path);\r\n this.pausedPaths.push(path);\r\n }\r\n },\r\n\r\n resumePatchPath(path) {\r\n let paths = path.split(\";\");\r\n for (path of paths) {\r\n let index = this.pausedPaths.indexOf(path);\r\n if (index !== -1) {\r\n // We don't care about key organisation, just that the entry is gone!\r\n delete this.pausedPaths[index];\r\n }\r\n }\r\n },\r\n\r\n // eslint-disable-next-line no-unused-vars\r\n patchData(json) {\r\n if (this.have_device) {\r\n for (let patch of json.Patch) {\r\n if (this.pausedPaths.includes(patch.path)) {\r\n continue;\r\n }\r\n\r\n applyOperation(this.status, patch, true, true, false);\r\n }\r\n this.validateActive();\r\n }\r\n },\r\n\r\n validateActive() {\r\n if (this.status.mixers[this.activeSerial] === undefined) {\r\n // We've lost our device, stop being active.\r\n this.activeSerial = \"\";\r\n }\r\n },\r\n\r\n pause() {\r\n this.active = false;\r\n },\r\n\r\n resume() {\r\n this.active = true;\r\n },\r\n\r\n isPaused() {\r\n return !this.active;\r\n },\r\n getAccessibilityNotification(type) {\r\n if (this.a11y.notifications.enabled) {\r\n return this.a11y.notifications[type];\r\n }\r\n return \"\";\r\n },\r\n setAccessibilityNotification(type, message) {\r\n this.a11y.notifications[type] = message;\r\n }\r\n});\r\n","import { render } from \"./A11yNotifications.vue?vue&type=template&id=1a3be3b1\"\nimport script from \"./A11yNotifications.vue?vue&type=script&lang=js\"\nexport * from \"./A11yNotifications.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"C:\\\\Users\\\\FrostyCoolSlug\\\\IdeaProjects\\\\goxlr-ui\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","\r\n\r\n\r\n\r\n\r\n","/**\r\n * A class designed to help manage request and responses to the GoXLR Utility via Websockets and HTTP.\r\n *\r\n * A lot of commands do not require responses as they're 'fire and forget', the only response that could possibly\r\n * be returned is an error which means that something has likely gone *SERIOUSLY* wrong, and we should abandon\r\n * all hope. As such, the daemon doesn't provide a response for most requests, and will only send errors, and\r\n * responses to GetStatus up the pipe to us, which we simply handle here. If you absolutely require a response from\r\n * a request (eg, profile management), send it as a standard command, and not a websocket command.\r\n *\r\n * Commands are sent via JSON, and are handled by serde on the rear end, this class will include some\r\n * helper methods for sending commands but the command structure will need to be understood first.\r\n *\r\n * Commands are documented in ipc/src/lib.rs under the GoXLRCommand enum, as an example, the Command to\r\n * change a volume level is defined as:\r\n * SetVolume(ChannelName, u8)\r\n *\r\n * Following the ChannelName to types/src/lib.rs, we get a list of channel names in the enum. Unless otherwise\r\n * stated by a #[repr] macro (See CompressorRatio), Serde expects these to be sent as Strings. Values to a\r\n * command are expected to be sent as an array of values. Using the above, SetVolume can be represented in JSON as:\r\n * { \"SetVolume\": [\"Chat\", 145] }\r\n *\r\n * If there is only one parameter for a command, an array isn't required.\r\n *\r\n * Extra Technical Stuff (not needed for most people), Obviously a command requires a serial, and the actual message\r\n * sent to the Daemon is a Command object, in this case, the same rules as above apply. Command is defined as:\r\n * Command(String, GoXLRCommand)\r\n *\r\n * With String being the serial. So expanding out the above, you end up with JSON that looks like:\r\n * {\"Command\": [\"serial\", { \"SetVolume\": [\"Chat\", 145]}]}\r\n *\r\n * The websocket class will abstract away the need to build a complete message.\r\n */\r\nimport {store} from \"@/store\";\r\n\r\n// TODO: Error checking and handling!\r\nexport class Websocket {\r\n #connection_promise = [];\r\n #message_queue = []\r\n #websocket = undefined;\r\n #command_index = 0;\r\n\r\n connect() {\r\n this.#websocket = new WebSocket(getWebsocketAddress());\r\n\r\n let self = this;\r\n self.#websocket.addEventListener('message', function(event) {\r\n // A message can be one of two things, either a DaemonStatus, or an error..\r\n let json = JSON.parse(event.data);\r\n\r\n let message_id = json.id;\r\n let message_data = json.data;\r\n if (message_data[\"Status\"] !== undefined) {\r\n self.#fulfill_promise(message_id, message_data, true);\r\n } else if (message_data[\"Patch\"] !== undefined) {\r\n // Nothing ever requests patch data, so we can ignore this.\r\n store.patchData(message_data);\r\n } else if (message_data === \"Ok\") {\r\n self.#fulfill_promise(message_id, message_data, true);\r\n } else {\r\n self.#fulfill_promise(message_id, message_data, false);\r\n console.log(\"Received Error from Websocket: \" + event.data);\r\n }\r\n });\r\n\r\n self.#websocket.addEventListener('open', function() {\r\n self.#connection_promise[0]();\r\n self.#connection_promise[0] = undefined;\r\n });\r\n\r\n self.#websocket.addEventListener('close', function() {\r\n if (self.#connection_promise[0] !== undefined) {\r\n self.#connection_promise[0]();\r\n self.#connection_promise[0] = undefined;\r\n }\r\n store.socketDisconnected();\r\n });\r\n\r\n self.#websocket.addEventListener('error', function() {\r\n if (self.#connection_promise[0] !== undefined) {\r\n self.#connection_promise[0]();\r\n self.#connection_promise[0] = undefined;\r\n }\r\n store.socketDisconnected();\r\n });\r\n\r\n return new Promise((resolve, reject) => {\r\n self.#connection_promise[0] = resolve;\r\n self.#connection_promise[1] = reject;\r\n });\r\n }\r\n\r\n get_status() {\r\n return this.#sendRequest(\"GetStatus\");\r\n }\r\n\r\n open_path(type) {\r\n let request = {\r\n \"OpenPath\": type\r\n }\r\n\r\n return this.send_daemon_command(request);\r\n }\r\n\r\n send_daemon_command(command) {\r\n let request = {\r\n \"Daemon\":\r\n command\r\n\r\n }\r\n return this.#sendRequest(request);\r\n }\r\n\r\n send_command(serial, command) {\r\n let request = {\r\n \"Command\": [\r\n serial,\r\n command\r\n ]\r\n }\r\n return this.#sendRequest(request);\r\n }\r\n\r\n #sendRequest(request) {\r\n let id = this.#command_index++;\r\n\r\n // Wrap this request with an ID\r\n let final_request = {\r\n id: id,\r\n data: request,\r\n }\r\n\r\n this.#websocket.send(JSON.stringify(final_request));\r\n\r\n // Create and return a response promise...\r\n let self = this;\r\n return new Promise((resolve, reject) => {\r\n self.#message_queue[id] = [];\r\n self.#message_queue[id][0] = resolve;\r\n self.#message_queue[id][1] = reject;\r\n });\r\n }\r\n\r\n #fulfill_promise(id, data, is_success) {\r\n if (this.#message_queue[id] !== undefined) {\r\n this.#message_queue[id][is_success ? 0 : 1](data);\r\n delete this.#message_queue[id];\r\n }\r\n }\r\n}\r\nexport const websocket = new Websocket();\r\n\r\n/*\r\n * This function simply sends a command via HTTP and returns a promise of a response.\r\n *\r\n * The GoXLR Daemon simply handles a DaemonRequest and returns a DaemonResponse, it doesn't do anything special for\r\n * errors, so we'll handle fulfill or reject here based on what comes back.\r\n */\r\nexport function sendHttpCommand(serial, command) {\r\n let request = {\r\n \"Command\": [\r\n serial,\r\n command\r\n ]\r\n }\r\n return executeHttpRequest(request);\r\n}\r\n\r\nfunction executeHttpRequest(request) {\r\n let cmd_resolve, cmd_reject;\r\n\r\n fetch(getHTTPAddress(), {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json'\r\n },\r\n body: JSON.stringify(request)\r\n })\r\n .then(response => response.json())\r\n .then(data => {\r\n if (data[\"Error\"] !== undefined) {\r\n cmd_reject(data[\"Error\"]);\r\n }\r\n cmd_resolve();\r\n })\r\n .catch((error) => {\r\n cmd_reject(\"HTTP Error: \" + error);\r\n });\r\n\r\n return new Promise((resolve, reject) => {\r\n cmd_resolve = resolve;\r\n cmd_reject = reject;\r\n });\r\n}\r\n\r\n/*\r\nThis is here to calculate the address. The dev environment is always on a different port to the daemon, so\r\nwe need to bounce requests across to the default port of the daemon. If we're running in production, we need\r\nto convert the HTTP request to a websocket request on the same port (this can be changed), so work it out here.\r\n */\r\nfunction getWebsocketAddress() {\r\n if (process.env.NODE_ENV === \"development\") {\r\n return \"ws://localhost:14564/api/websocket\";\r\n }\r\n return \"ws://\" + window.location.host + \"/api/websocket\";\r\n}\r\n\r\n// Same as above, except for HTTP request...\r\nfunction getHTTPAddress() {\r\n return getBaseHTTPAddress() + \"api/command\";\r\n}\r\n\r\nexport function getBaseHTTPAddress() {\r\n if (process.env.NODE_ENV === \"development\") {\r\n return \"http://localhost:14564/\";\r\n }\r\n return \"/\";\r\n}\r\n","\r\n\r\n\r\n\r\n\r\n","\r\n\r\n\r\n\r\n\r\n","import { render } from \"./WidgetContainer.vue?vue&type=template&id=799f2278&scoped=true\"\nimport script from \"./WidgetContainer.vue?vue&type=script&lang=js\"\nexport * from \"./WidgetContainer.vue?vue&type=script&lang=js\"\n\nimport \"./WidgetContainer.vue?vue&type=style&index=0&id=799f2278&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\FrostyCoolSlug\\\\IdeaProjects\\\\goxlr-ui\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-799f2278\"]])\n\nexport default __exports__","\r\n\r\n\r\n","\r\n\r\n\r\n\r\n\r\n\r\n","import { render } from \"./VerticalScrollingContainer.vue?vue&type=template&id=4bf82814&scoped=true\"\nimport script from \"./VerticalScrollingContainer.vue?vue&type=script&lang=js\"\nexport * from \"./VerticalScrollingContainer.vue?vue&type=script&lang=js\"\n\nimport \"./VerticalScrollingContainer.vue?vue&type=style&index=0&id=4bf82814&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\FrostyCoolSlug\\\\IdeaProjects\\\\goxlr-ui\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-4bf82814\"]])\n\nexport default __exports__","\r\n\r\n\r\n\r\n\r\n","\r\n\r\n\r\n\r\n\r\n","import { render } from \"./RadioItem.vue?vue&type=template&id=15d478d7&scoped=true\"\nimport script from \"./RadioItem.vue?vue&type=script&lang=js\"\nexport * from \"./RadioItem.vue?vue&type=script&lang=js\"\n\nimport \"./RadioItem.vue?vue&type=style&index=0&id=15d478d7&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\FrostyCoolSlug\\\\IdeaProjects\\\\goxlr-ui\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-15d478d7\"]])\n\nexport default __exports__","\r\n\r\n\r\n\r\n\r\n","import { render } from \"./DropMenu.vue?vue&type=template&id=d3088ef8&scoped=true\"\nimport script from \"./DropMenu.vue?vue&type=script&lang=js\"\nexport * from \"./DropMenu.vue?vue&type=script&lang=js\"\n\nimport \"./DropMenu.vue?vue&type=style&index=0&id=d3088ef8&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\FrostyCoolSlug\\\\IdeaProjects\\\\goxlr-ui\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-d3088ef8\"]])\n\nexport default __exports__","import { render } from \"./RadioList.vue?vue&type=template&id=bbcf45ca&scoped=true\"\nimport script from \"./RadioList.vue?vue&type=script&lang=js\"\nexport * from \"./RadioList.vue?vue&type=script&lang=js\"\n\nimport \"./RadioList.vue?vue&type=style&index=0&id=bbcf45ca&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\FrostyCoolSlug\\\\IdeaProjects\\\\goxlr-ui\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-bbcf45ca\"]])\n\nexport default __exports__","import { render } from \"./ScrollingRadioList.vue?vue&type=template&id=737bb15c\"\nimport script from \"./ScrollingRadioList.vue?vue&type=script&lang=js\"\nexport * from \"./ScrollingRadioList.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"C:\\\\Users\\\\FrostyCoolSlug\\\\IdeaProjects\\\\goxlr-ui\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { render } from \"./RadioSelection.vue?vue&type=template&id=e55c0876\"\nimport script from \"./RadioSelection.vue?vue&type=script&lang=js\"\nexport * from \"./RadioSelection.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"C:\\\\Users\\\\FrostyCoolSlug\\\\IdeaProjects\\\\goxlr-ui\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","\r\n\r\n\r\n\r\n\r\n","import { render } from \"./GroupContainer.vue?vue&type=template&id=78b23cc5&scoped=true\"\nimport script from \"./GroupContainer.vue?vue&type=script&lang=js\"\nexport * from \"./GroupContainer.vue?vue&type=script&lang=js\"\n\nimport \"./GroupContainer.vue?vue&type=style&index=0&id=78b23cc5&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\FrostyCoolSlug\\\\IdeaProjects\\\\goxlr-ui\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-78b23cc5\"]])\n\nexport default __exports__","import { render } from \"./Faders.vue?vue&type=template&id=7ccb2986\"\nimport script from \"./Faders.vue?vue&type=script&lang=js\"\nexport * from \"./Faders.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"C:\\\\Users\\\\FrostyCoolSlug\\\\IdeaProjects\\\\goxlr-ui\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","\r\n\r\n\r\n\r\n\r\n","\r\n\r\n\r\n\r\n\r\n","\r\n\r\n\r\n\r\n\r\n","import { render } from \"./Label.vue?vue&type=template&id=655a8462&scoped=true\"\nimport script from \"./Label.vue?vue&type=script&lang=js\"\nexport * from \"./Label.vue?vue&type=script&lang=js\"\n\nimport \"./Label.vue?vue&type=style&index=0&id=655a8462&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\FrostyCoolSlug\\\\IdeaProjects\\\\goxlr-ui\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-655a8462\"]])\n\nexport default __exports__","\r\n\r\n\r\n\r\n\r\n","import { render } from \"./Range.vue?vue&type=template&id=68eec8f9&scoped=true\"\nimport script from \"./Range.vue?vue&type=script&lang=js\"\nexport * from \"./Range.vue?vue&type=script&lang=js\"\n\nimport \"./Range.vue?vue&type=style&index=0&id=68eec8f9&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\FrostyCoolSlug\\\\IdeaProjects\\\\goxlr-ui\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-68eec8f9\"]])\n\nexport default __exports__","\r\n\r\n\r\n\r\n\r\n","import { render } from \"./Input.vue?vue&type=template&id=309d2ca5&scoped=true\"\nimport script from \"./Input.vue?vue&type=script&lang=js\"\nexport * from \"./Input.vue?vue&type=script&lang=js\"\n\nimport \"./Input.vue?vue&type=style&index=0&id=309d2ca5&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\FrostyCoolSlug\\\\IdeaProjects\\\\goxlr-ui\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-309d2ca5\"]])\n\nexport default __exports__","import { render } from \"./Slider.vue?vue&type=template&id=3d12ab03&scoped=true\"\nimport script from \"./Slider.vue?vue&type=script&lang=js\"\nexport * from \"./Slider.vue?vue&type=script&lang=js\"\n\nimport \"./Slider.vue?vue&type=style&index=0&id=3d12ab03&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\FrostyCoolSlug\\\\IdeaProjects\\\\goxlr-ui\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-3d12ab03\"]])\n\nexport default __exports__","/**\r\n * This file primarily contains mappings from Utility Enums to Javascript representations, they're used for checking\r\n * values against the DaemonStatus, as well as sending updates, so order and naming is important! Some parts of the\r\n * code (such as faders and mixers) will directly reference array values, it's not ideal, but until some cleaner\r\n * representation can happen it's more efficient than constantly bouncing back and forward between array indexes.\r\n */\r\n\r\nexport const ScribbleNames = {\r\n \"A\": \"Scribble1\",\r\n \"B\": \"Scribble2\",\r\n \"C\": \"Scribble3\",\r\n \"D\": \"Scribble4\",\r\n}\r\n\r\nexport const MuteButtonNamesForFader = {\r\n \"A\": \"Fader1Mute\",\r\n \"B\": \"Fader2Mute\",\r\n \"C\": \"Fader3Mute\",\r\n \"D\": \"Fader4Mute\",\r\n}\r\n\r\nexport const InputDevice = {\r\n \"Microphone\": \"Microphone\",\r\n \"Chat\": \"Chat\",\r\n \"Music\": \"Music\",\r\n \"Game\": \"Game\",\r\n \"Console\": \"Console\",\r\n \"Line In\": \"LineIn\",\r\n \"System\": \"System\",\r\n \"Samples\": \"Samples\"\r\n}\r\n\r\nexport const OutputDevice = {\r\n \"Headphones\": \"Headphones\",\r\n \"Stream Mix\": \"BroadcastMix\",\r\n \"Line Out\": \"LineOut\",\r\n \"Chat Mic\": \"ChatMic\",\r\n \"Sampler\": \"Sampler\",\r\n}\r\n\r\nexport const ChannelName = [\r\n \"Mic\",\r\n \"LineIn\",\r\n \"Console\",\r\n \"System\",\r\n \"Game\",\r\n \"Chat\",\r\n \"Sample\",\r\n \"Music\",\r\n \"Headphones\",\r\n \"MicMonitor\",\r\n \"LineOut\",\r\n]\r\n\r\n/**\r\n * TODO: This might need to be handled in the Daemon, we've hit a situation where the the ChannelName and InputDevice\r\n * enums aren't synced correctly, despite almost representing the same thing, which can cause weirdness.\r\n * @param name\r\n * @returns {*|string}\r\n */\r\nexport function channelNameToInputDevice(name) {\r\n if (name === 'Mic') {\r\n return 'Microphone';\r\n }\r\n if (name === 'Sample') {\r\n return 'Samples';\r\n }\r\n return name;\r\n}\r\n\r\nexport const ChannelNameReadable = {\r\n \"Mic\": \"Mic\",\r\n \"LineIn\": \"Line In\",\r\n \"Console\": \"Console\",\r\n \"System\": \"System\",\r\n \"Game\": \"Game\",\r\n \"Chat\": \"Voice Chat\",\r\n \"Sample\": \"Sample\",\r\n \"Music\": \"Music\",\r\n \"Headphones\": \"Headphones\",\r\n \"MicMonitor\": \"Mic Monitor\",\r\n \"LineOut\": \"Line Out\",\r\n}\r\n\r\nexport const EffectPresets = [\r\n \"Preset1\",\r\n \"Preset2\",\r\n \"Preset3\",\r\n \"Preset4\",\r\n \"Preset5\",\r\n \"Preset6\",\r\n]\r\n\r\nexport const EffectLightingPresets = [\r\n \"EffectSelect1\",\r\n \"EffectSelect2\",\r\n \"EffectSelect3\",\r\n \"EffectSelect4\",\r\n \"EffectSelect5\",\r\n \"EffectSelect6\",\r\n]\r\n\r\nexport const EqMiniFreqs = [\r\n \"Equalizer90Hz\",\r\n \"Equalizer250Hz\",\r\n \"Equalizer500Hz\",\r\n \"Equalizer1KHz\",\r\n \"Equalizer3KHz\",\r\n \"Equalizer8KHz\",\r\n]\r\n\r\nexport const EqFreqs = [\r\n \"Equalizer31Hz\",\r\n \"Equalizer63Hz\",\r\n \"Equalizer125Hz\",\r\n \"Equalizer250Hz\",\r\n \"Equalizer500Hz\",\r\n \"Equalizer1KHz\",\r\n \"Equalizer2KHz\",\r\n \"Equalizer4KHz\",\r\n \"Equalizer8KHz\",\r\n \"Equalizer16KHz\",\r\n]\r\n\r\nexport let InputMixer = [\r\n \"Mic\",\r\n \"Chat\",\r\n \"Music\",\r\n \"Game\",\r\n \"Console\",\r\n \"LineIn\",\r\n \"System\",\r\n \"Sample\",\r\n]\r\n\r\n\r\nexport let OutputMixer = [\r\n \"LineOut\",\r\n \"Headphones\",\r\n \"MicMonitor\",\r\n]\r\n\r\n/* Items in here are hidden behind the 'Expand' button */\r\nexport let OutputMixerSubmixHidden = [\r\n \"MicMonitor\"\r\n]\r\n\r\nexport const LightingInactiveOptions = [\r\n {\r\n id: 'Dimmed',\r\n label: 'Dim Active Colour'\r\n },\r\n {\r\n id: 'Colour2',\r\n label: 'Inactive Colour'\r\n },\r\n {\r\n id: 'DimmedColour2',\r\n label: 'Dim Inactive Colour'\r\n }\r\n]\r\n","\r\n\r\n\r\n\r\n\r\n","import { render } from \"./SubmixSlider.vue?vue&type=template&id=356eb5a3&scoped=true\"\nimport script from \"./SubmixSlider.vue?vue&type=script&lang=js\"\nexport * from \"./SubmixSlider.vue?vue&type=script&lang=js\"\n\nimport \"./SubmixSlider.vue?vue&type=style&index=0&id=356eb5a3&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\FrostyCoolSlug\\\\IdeaProjects\\\\goxlr-ui\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-356eb5a3\"]])\n\nexport default __exports__","\r\n\r\n\r\n\r\n\r\n","import { render } from \"./CenteredContainer.vue?vue&type=template&id=4ac8e0c2&scoped=true\"\nimport script from \"./CenteredContainer.vue?vue&type=script&lang=js\"\nexport * from \"./CenteredContainer.vue?vue&type=script&lang=js\"\n\nimport \"./CenteredContainer.vue?vue&type=style&index=0&id=4ac8e0c2&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\FrostyCoolSlug\\\\IdeaProjects\\\\goxlr-ui\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-4ac8e0c2\"]])\n\nexport default __exports__","\r\n\r\n\r\n\r\n","\r\n\r\n\r\n\r\n","import { render } from \"./AssignmentEntry.vue?vue&type=template&id=5a6d5e18&scoped=true\"\nimport script from \"./AssignmentEntry.vue?vue&type=script&lang=js\"\nexport * from \"./AssignmentEntry.vue?vue&type=script&lang=js\"\n\nimport \"./AssignmentEntry.vue?vue&type=style&index=0&id=5a6d5e18&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\FrostyCoolSlug\\\\IdeaProjects\\\\goxlr-ui\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-5a6d5e18\"]])\n\nexport default __exports__","import { render } from \"./MixAssignment.vue?vue&type=template&id=4e6660be\"\nimport script from \"./MixAssignment.vue?vue&type=script&lang=js\"\nexport * from \"./MixAssignment.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"C:\\\\Users\\\\FrostyCoolSlug\\\\IdeaProjects\\\\goxlr-ui\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { render } from \"./Mixer.vue?vue&type=template&id=35c96192&scoped=true\"\nimport script from \"./Mixer.vue?vue&type=script&lang=js\"\nexport * from \"./Mixer.vue?vue&type=script&lang=js\"\n\nimport \"./Mixer.vue?vue&type=style&index=0&id=35c96192&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\FrostyCoolSlug\\\\IdeaProjects\\\\goxlr-ui\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-35c96192\"]])\n\nexport default __exports__","\r\n\r\n\r\n\r\n\r\n","import { render } from \"./Tabs.vue?vue&type=template&id=3e52d46c\"\nimport script from \"./Tabs.vue?vue&type=script&lang=js\"\nexport * from \"./Tabs.vue?vue&type=script&lang=js\"\n\nimport \"./Tabs.vue?vue&type=style&index=0&id=3e52d46c&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\FrostyCoolSlug\\\\IdeaProjects\\\\goxlr-ui\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","\r\n\r\n\r\n\r\n\r\n","import { render } from \"./Tab.vue?vue&type=template&id=0b2b7c4e\"\nimport script from \"./Tab.vue?vue&type=script&lang=js\"\nexport * from \"./Tab.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"C:\\\\Users\\\\FrostyCoolSlug\\\\IdeaProjects\\\\goxlr-ui\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","\r\n\r\n\r\n\r\n\r\n","\r\n\r\n\r\n\r\n\r\n","import { render } from \"./Cell.vue?vue&type=template&id=237530a4&scoped=true\"\nimport script from \"./Cell.vue?vue&type=script&lang=js\"\nexport * from \"./Cell.vue?vue&type=script&lang=js\"\n\nimport \"./Cell.vue?vue&type=style&index=0&id=237530a4&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\FrostyCoolSlug\\\\IdeaProjects\\\\goxlr-ui\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-237530a4\"]])\n\nexport default __exports__","\r\n\r\n\r\n\r\n","import { render } from \"./SubmixButton.vue?vue&type=template&id=afeded80&scoped=true\"\nimport script from \"./SubmixButton.vue?vue&type=script&lang=js\"\nexport * from \"./SubmixButton.vue?vue&type=script&lang=js\"\n\nimport \"./SubmixButton.vue?vue&type=style&index=0&id=afeded80&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\FrostyCoolSlug\\\\IdeaProjects\\\\goxlr-ui\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-afeded80\"]])\n\nexport default __exports__","import { render } from \"./Routing.vue?vue&type=template&id=6dca3b08&scoped=true\"\nimport script from \"./Routing.vue?vue&type=script&lang=js\"\nexport * from \"./Routing.vue?vue&type=script&lang=js\"\n\nimport \"./Routing.vue?vue&type=style&index=0&id=6dca3b08&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\FrostyCoolSlug\\\\IdeaProjects\\\\goxlr-ui\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-6dca3b08\"]])\n\nexport default __exports__","\r\n\r\n\r\n\r\n\r\n","\r\n\r\n\r\n\r\n\r\n","\r\n\r\n\r\n\r\n\r\n","\r\n\r\n\r\n\r\n\r\n","import { render } from \"./ExpandoBox.vue?vue&type=template&id=086d4e0f&scoped=true\"\nimport script from \"./ExpandoBox.vue?vue&type=script&lang=js\"\nexport * from \"./ExpandoBox.vue?vue&type=script&lang=js\"\n\nimport \"./ExpandoBox.vue?vue&type=style&index=0&id=086d4e0f&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\FrostyCoolSlug\\\\IdeaProjects\\\\goxlr-ui\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-086d4e0f\"]])\n\nexport default __exports__","import { render } from \"./ExpandoGroupContainer.vue?vue&type=template&id=2c0fc602&scoped=true\"\nimport script from \"./ExpandoGroupContainer.vue?vue&type=script&lang=js\"\nexport * from \"./ExpandoGroupContainer.vue?vue&type=script&lang=js\"\n\nimport \"./ExpandoGroupContainer.vue?vue&type=style&index=0&id=2c0fc602&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\FrostyCoolSlug\\\\IdeaProjects\\\\goxlr-ui\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-2c0fc602\"]])\n\nexport default __exports__","import { render } from \"./Gate.vue?vue&type=template&id=ea707ec6&scoped=true\"\nimport script from \"./Gate.vue?vue&type=script&lang=js\"\nexport * from \"./Gate.vue?vue&type=script&lang=js\"\n\nimport \"./Gate.vue?vue&type=style&index=0&id=ea707ec6&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\FrostyCoolSlug\\\\IdeaProjects\\\\goxlr-ui\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-ea707ec6\"]])\n\nexport default __exports__","\r\n\r\n\r\n\r\n\r\n","import {store} from \"@/store\";\r\n\r\nexport function isDeviceMini() {\r\n // Do this here, rather than on created() so it can update if the device changes\r\n return store.getActiveDevice().hardware.device_type === \"Mini\";\r\n}\r\n\r\nexport function roundToStep(value, step) {\r\n step || (step = 1.0);\r\n let inverse = 1.0 / step;\r\n return Math.round(value * inverse) / inverse;\r\n}\r\n","\r\n\r\n\r\n\r\n\r\n","import { render } from \"./FineTuneHeader.vue?vue&type=template&id=788e65be\"\nimport script from \"./FineTuneHeader.vue?vue&type=script&lang=js\"\nexport * from \"./FineTuneHeader.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"C:\\\\Users\\\\FrostyCoolSlug\\\\IdeaProjects\\\\goxlr-ui\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { render } from \"./Equalizer.vue?vue&type=template&id=35cf325b&scoped=true\"\nimport script from \"./Equalizer.vue?vue&type=script&lang=js\"\nexport * from \"./Equalizer.vue?vue&type=script&lang=js\"\n\nimport \"./Equalizer.vue?vue&type=style&index=0&id=35cf325b&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\FrostyCoolSlug\\\\IdeaProjects\\\\goxlr-ui\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-35cf325b\"]])\n\nexport default __exports__","\r\n\r\n\r\n\r\n\r\n","import { render } from \"./Compressor.vue?vue&type=template&id=d7e5afb8\"\nimport script from \"./Compressor.vue?vue&type=script&lang=js\"\nexport * from \"./Compressor.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"C:\\\\Users\\\\FrostyCoolSlug\\\\IdeaProjects\\\\goxlr-ui\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","\r\n\r\n\r\n\r\n\r\n","import { render } from \"./MicExtra.vue?vue&type=template&id=594f0622\"\nimport script from \"./MicExtra.vue?vue&type=script&lang=js\"\nexport * from \"./MicExtra.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"C:\\\\Users\\\\FrostyCoolSlug\\\\IdeaProjects\\\\goxlr-ui\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","\r\n\r\n\r\n\r\n\r\n","\r\n\r\n\r\n\r\n\r\n","\r\n\r\n\r\n\r\n","import { render } from \"./ProfileButtonList.vue?vue&type=template&id=31c48871&scoped=true\"\nimport script from \"./ProfileButtonList.vue?vue&type=script&lang=js\"\nexport * from \"./ProfileButtonList.vue?vue&type=script&lang=js\"\n\nimport \"./ProfileButtonList.vue?vue&type=style&index=0&id=31c48871&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\FrostyCoolSlug\\\\IdeaProjects\\\\goxlr-ui\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-31c48871\"]])\n\nexport default __exports__","\r\n\r\n\r\n\r\n\r\n","import { render } from \"./ProfileButton.vue?vue&type=template&id=30339110&scoped=true\"\nimport script from \"./ProfileButton.vue?vue&type=script&lang=js\"\nexport * from \"./ProfileButton.vue?vue&type=script&lang=js\"\n\nimport \"./ProfileButton.vue?vue&type=style&index=0&id=30339110&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\FrostyCoolSlug\\\\IdeaProjects\\\\goxlr-ui\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-30339110\"]])\n\nexport default __exports__","\r\n\r\n\r\n\r\n\r\n","import { render } from \"./ModalButton.vue?vue&type=template&id=3d98c1d8&scoped=true\"\nimport script from \"./ModalButton.vue?vue&type=script&lang=js\"\nexport * from \"./ModalButton.vue?vue&type=script&lang=js\"\n\nimport \"./ModalButton.vue?vue&type=style&index=0&id=3d98c1d8&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\FrostyCoolSlug\\\\IdeaProjects\\\\goxlr-ui\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-3d98c1d8\"]])\n\nexport default __exports__","\r\n\r\n\r\n\r\n\r\n","import { render } from \"./ModalInput.vue?vue&type=template&id=685e508a&scoped=true\"\nimport script from \"./ModalInput.vue?vue&type=script&lang=js\"\nexport * from \"./ModalInput.vue?vue&type=script&lang=js\"\n\nimport \"./ModalInput.vue?vue&type=style&index=0&id=685e508a&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\FrostyCoolSlug\\\\IdeaProjects\\\\goxlr-ui\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-685e508a\"]])\n\nexport default __exports__","\r\n\r\n\r\n\r\n\r\n","import { render } from \"./AccessibleModal.vue?vue&type=template&id=67edad44&scoped=true\"\nimport script from \"./AccessibleModal.vue?vue&type=script&lang=js\"\nexport * from \"./AccessibleModal.vue?vue&type=script&lang=js\"\n\nimport \"./AccessibleModal.vue?vue&type=style&index=0&id=67edad44&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\FrostyCoolSlug\\\\IdeaProjects\\\\goxlr-ui\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-67edad44\"]])\n\nexport default __exports__","import { render } from \"./ProfileManager.vue?vue&type=template&id=805d98da&scoped=true\"\nimport script from \"./ProfileManager.vue?vue&type=script&lang=js\"\nexport * from \"./ProfileManager.vue?vue&type=script&lang=js\"\n\nimport \"./ProfileManager.vue?vue&type=style&index=0&id=805d98da&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\FrostyCoolSlug\\\\IdeaProjects\\\\goxlr-ui\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-805d98da\"]])\n\nexport default __exports__","import { render } from \"./MicProfileHandler.vue?vue&type=template&id=23d8e2e6&scoped=true\"\nimport script from \"./MicProfileHandler.vue?vue&type=script&lang=js\"\nexport * from \"./MicProfileHandler.vue?vue&type=script&lang=js\"\n\nimport \"./MicProfileHandler.vue?vue&type=style&index=0&id=23d8e2e6&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\FrostyCoolSlug\\\\IdeaProjects\\\\goxlr-ui\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-23d8e2e6\"]])\n\nexport default __exports__","\r\n\r\n\r\n\r\n\r\n","\r\n\r\n\r\n\r\n\r\n","import { render } from \"./BigButton.vue?vue&type=template&id=3c73aae0&scoped=true\"\nimport script from \"./BigButton.vue?vue&type=script&lang=js\"\nexport * from \"./BigButton.vue?vue&type=script&lang=js\"\n\nimport \"./BigButton.vue?vue&type=style&index=0&id=3c73aae0&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\FrostyCoolSlug\\\\IdeaProjects\\\\goxlr-ui\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-3c73aae0\"]])\n\nexport default __exports__","\r\n\r\n\r\n\r\n\r\n","\r\n\r\n\r\n\r\n\r\n","import { render } from \"./ContentContainer.vue?vue&type=template&id=1577c4b6&scoped=true\"\nimport script from \"./ContentContainer.vue?vue&type=script&lang=js\"\nexport * from \"./ContentContainer.vue?vue&type=script&lang=js\"\n\nimport \"./ContentContainer.vue?vue&type=style&index=0&id=1577c4b6&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\FrostyCoolSlug\\\\IdeaProjects\\\\goxlr-ui\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-1577c4b6\"]])\n\nexport default __exports__","import { render } from \"./SetupModel.vue?vue&type=template&id=650ac712\"\nimport script from \"./SetupModel.vue?vue&type=script&lang=js\"\nexport * from \"./SetupModel.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"C:\\\\Users\\\\FrostyCoolSlug\\\\IdeaProjects\\\\goxlr-ui\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { render } from \"./MicSetupButton.vue?vue&type=template&id=c0202688\"\nimport script from \"./MicSetupButton.vue?vue&type=script&lang=js\"\nexport * from \"./MicSetupButton.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"C:\\\\Users\\\\FrostyCoolSlug\\\\IdeaProjects\\\\goxlr-ui\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","\r\n\r\n\r\n\r\n","import { render } from \"./ContentBox.vue?vue&type=template&id=36f4d98c&scoped=true\"\nimport script from \"./ContentBox.vue?vue&type=script&lang=js\"\nexport * from \"./ContentBox.vue?vue&type=script&lang=js\"\n\nimport \"./ContentBox.vue?vue&type=style&index=0&id=36f4d98c&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\FrostyCoolSlug\\\\IdeaProjects\\\\goxlr-ui\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-36f4d98c\"]])\n\nexport default __exports__","import { render } from \"./Mic.vue?vue&type=template&id=b00ac9bc\"\nimport script from \"./Mic.vue?vue&type=script&lang=js\"\nexport * from \"./Mic.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"C:\\\\Users\\\\FrostyCoolSlug\\\\IdeaProjects\\\\goxlr-ui\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","\r\n\r\n\r\n\r\n\r\n","\r\n\r\n\r\n\r\n\r\n","import { render } from \"./Button.vue?vue&type=template&id=5ca998d7&scoped=true\"\nimport script from \"./Button.vue?vue&type=script&lang=js\"\nexport * from \"./Button.vue?vue&type=script&lang=js\"\n\nimport \"./Button.vue?vue&type=style&index=0&id=5ca998d7&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\FrostyCoolSlug\\\\IdeaProjects\\\\goxlr-ui\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-5ca998d7\"]])\n\nexport default __exports__","\r\n\r\n\r\n\r\n\r\n","import { render } from \"./SettingsButton.vue?vue&type=template&id=1f10a28d&scoped=true\"\nimport script from \"./SettingsButton.vue?vue&type=script&lang=js\"\nexport * from \"./SettingsButton.vue?vue&type=script&lang=js\"\n\nimport \"./SettingsButton.vue?vue&type=style&index=0&id=1f10a28d&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\FrostyCoolSlug\\\\IdeaProjects\\\\goxlr-ui\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-1f10a28d\"]])\n\nexport default __exports__","import { render } from \"./DeviceSelector.vue?vue&type=template&id=c28daa12&scoped=true\"\nimport script from \"./DeviceSelector.vue?vue&type=script&lang=js\"\nexport * from \"./DeviceSelector.vue?vue&type=script&lang=js\"\n\nimport \"./DeviceSelector.vue?vue&type=style&index=0&id=c28daa12&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\FrostyCoolSlug\\\\IdeaProjects\\\\goxlr-ui\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-c28daa12\"]])\n\nexport default __exports__","\r\n\r\n\r\n\r\n\r\n","import { render } from \"./Cough.vue?vue&type=template&id=cfe0e206\"\nimport script from \"./Cough.vue?vue&type=script&lang=js\"\nexport * from \"./Cough.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"C:\\\\Users\\\\FrostyCoolSlug\\\\IdeaProjects\\\\goxlr-ui\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","\r\n\r\n\r\n\r\n\r\n","\r\n\r\n\r\n\r\n","import { render } from \"./LicenseButton.vue?vue&type=template&id=3ffabd79\"\nimport script from \"./LicenseButton.vue?vue&type=script&lang=js\"\nexport * from \"./LicenseButton.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"C:\\\\Users\\\\FrostyCoolSlug\\\\IdeaProjects\\\\goxlr-ui\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","\r\n\r\n\r\n\r\n","import { render } from \"./AboutButton.vue?vue&type=template&id=98398a20\"\nimport script from \"./AboutButton.vue?vue&type=script&lang=js\"\nexport * from \"./AboutButton.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"C:\\\\Users\\\\FrostyCoolSlug\\\\IdeaProjects\\\\goxlr-ui\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","\r\n\r\n\r\n\r\n","import { render } from \"./HelpButton.vue?vue&type=template&id=d0e8a456\"\nimport script from \"./HelpButton.vue?vue&type=script&lang=js\"\nexport * from \"./HelpButton.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"C:\\\\Users\\\\FrostyCoolSlug\\\\IdeaProjects\\\\goxlr-ui\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","\r\n\r\n\r\n\r\n","import { render } from \"./ShutdownButton.vue?vue&type=template&id=5ad6f86e\"\nimport script from \"./ShutdownButton.vue?vue&type=script&lang=js\"\nexport * from \"./ShutdownButton.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"C:\\\\Users\\\\FrostyCoolSlug\\\\IdeaProjects\\\\goxlr-ui\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","\r\n\r\n\r\n\r\n\r\n","\r\n\r\n\r\n\r\n\r\n","import { render } from \"./SimpleNumberInput.vue?vue&type=template&id=8f3372e6\"\nimport script from \"./SimpleNumberInput.vue?vue&type=script&lang=js\"\nexport * from \"./SimpleNumberInput.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"C:\\\\Users\\\\FrostyCoolSlug\\\\IdeaProjects\\\\goxlr-ui\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { render } from \"./DeviceSettingsButton.vue?vue&type=template&id=b5c7464a\"\nimport script from \"./DeviceSettingsButton.vue?vue&type=script&lang=js\"\nexport * from \"./DeviceSettingsButton.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"C:\\\\Users\\\\FrostyCoolSlug\\\\IdeaProjects\\\\goxlr-ui\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","\r\n\r\n\r\n\r\n\r\n","import { render } from \"./SwitchDeviceButton.vue?vue&type=template&id=2b11cc3b\"\nimport script from \"./SwitchDeviceButton.vue?vue&type=script&lang=js\"\nexport * from \"./SwitchDeviceButton.vue?vue&type=script&lang=js\"\n\nimport exportComponent from \"C:\\\\Users\\\\FrostyCoolSlug\\\\IdeaProjects\\\\goxlr-ui\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render]])\n\nexport default __exports__","import { render } from \"./System.vue?vue&type=template&id=badc2710&scoped=true\"\nimport script from \"./System.vue?vue&type=script&lang=js\"\nexport * from \"./System.vue?vue&type=script&lang=js\"\n\nimport \"./System.vue?vue&type=style&index=0&id=badc2710&scoped=true&lang=css\"\n\nimport exportComponent from \"C:\\\\Users\\\\FrostyCoolSlug\\\\IdeaProjects\\\\goxlr-ui\\\\node_modules\\\\vue-loader\\\\dist\\\\exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['render',render],['__scopeId',\"data-v-badc2710\"]])\n\nexport default __exports__","\r\n\r\n\r\n\r\n\r\n","