diff --git a/Cargo.lock b/Cargo.lock index 11e7df1..49a281d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,43 +2,1478 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "ab_glyph" +version = "0.2.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01c0457472c38ea5bd1c3b5ada5e368271cb550be7a4ca4a0b4634e9913f6cc2" +dependencies = [ + "ab_glyph_rasterizer", + "owned_ttf_parser", +] + +[[package]] +name = "ab_glyph_rasterizer" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "366ffbaa4442f4684d91e2cd7c5ea7c4ed8add41959a31447066e279e432b618" + +[[package]] +name = "accesskit" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf203f9d3bd8f29f98833d1fbef628df18f759248a547e7e01cfbf63cda36a99" + +[[package]] +name = "accesskit_atspi_common" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "890d241cf51fc784f0ac5ac34dfc847421f8d39da6c7c91a0fcc987db62a8267" +dependencies = [ + "accesskit", + "accesskit_consumer", + "atspi-common", + "serde", + "thiserror 1.0.69", + "zvariant", +] + +[[package]] +name = "accesskit_consumer" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db81010a6895d8707f9072e6ce98070579b43b717193d2614014abd5cb17dd43" +dependencies = [ + "accesskit", + "hashbrown 0.15.5", +] + +[[package]] +name = "accesskit_macos" +version = "0.22.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0089e5c0ac0ca281e13ea374773898d9354cc28d15af9f0f7394d44a495b575" +dependencies = [ + "accesskit", + "accesskit_consumer", + "hashbrown 0.15.5", + "objc2 0.5.2", + "objc2-app-kit 0.2.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "accesskit_unix" +version = "0.17.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "301e55b39cfc15d9c48943ce5f572204a551646700d0e8efa424585f94fec528" +dependencies = [ + "accesskit", + "accesskit_atspi_common", + "async-channel", + "async-executor", + "async-task", + "atspi", + "futures-lite", + "futures-util", + "serde", + "zbus", +] + +[[package]] +name = "accesskit_windows" +version = "0.29.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2d63dd5041e49c363d83f5419a896ecb074d309c414036f616dc0b04faca971" +dependencies = [ + "accesskit", + "accesskit_consumer", + "hashbrown 0.15.5", + "static_assertions", + "windows 0.61.3", + "windows-core 0.61.2", +] + +[[package]] +name = "accesskit_winit" +version = "0.29.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8cfabe59d0eaca7412bfb1f70198dd31e3b0496fee7e15b066f9c36a1a140a0" +dependencies = [ + "accesskit", + "accesskit_macos", + "accesskit_unix", + "accesskit_windows", + "raw-window-handle", + "winit", +] + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "getrandom 0.3.4", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "alsa" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "812947049edcd670a82cd5c73c3661d2e58468577ba8489de58e1a73c04cbd5d" +dependencies = [ + "alsa-sys", + "bitflags 2.11.0", + "cfg-if", + "libc", +] + +[[package]] +name = "alsa-sys" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad7569085a265dd3f607ebecce7458eaab2132a84393534c95b18dcbc3f31e04" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "android-activity" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef6978589202a00cd7e118380c448a08b6ed394c3a8df3a430d0898e3a42d046" +dependencies = [ + "android-properties", + "bitflags 2.11.0", + "cc", + "cesu8", + "jni", + "jni-sys", + "libc", + "log", + "ndk", + "ndk-context", + "ndk-sys", + "num_enum", + "thiserror 1.0.69", +] + +[[package]] +name = "android-properties" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anyhow" +version = "1.0.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" + +[[package]] +name = "arboard" +version = "3.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0348a1c054491f4bfe6ab86a7b6ab1e44e45d899005de92f58b3df180b36ddaf" +dependencies = [ + "clipboard-win", + "image", + "log", + "objc2 0.6.4", + "objc2-app-kit 0.3.2", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation 0.3.2", + "parking_lot", + "percent-encoding", + "windows-sys 0.60.2", + "x11rb", +] + +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "as-raw-xcb-connection" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" + +[[package]] +name = "ash" +version = "0.38.0+1.3.281" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bb44936d800fea8f016d7f2311c6a4f97aebd5dc86f09906139ec848cf3a46f" +dependencies = [ + "libloading", +] + +[[package]] +name = "async-broadcast" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" +dependencies = [ + "event-listener", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-channel" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-executor" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c96bf972d85afc50bf5ab8fe2d54d1586b4e0b46c97c50a0c9e71e2f7bcd812a" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand", + "futures-lite", + "pin-project-lite", + "slab", +] + +[[package]] +name = "async-io" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" +dependencies = [ + "autocfg", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite", + "parking", + "polling", + "rustix 1.1.4", + "slab", + "windows-sys 0.61.2", +] + +[[package]] +name = "async-lock" +version = "3.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" +dependencies = [ + "event-listener", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-process" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" +dependencies = [ + "async-channel", + "async-io", + "async-lock", + "async-signal", + "async-task", + "blocking", + "cfg-if", + "event-listener", + "futures-lite", + "rustix 1.1.4", +] + +[[package]] +name = "async-recursion" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "async-signal" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43c070bbf59cd3570b6b2dd54cd772527c7c3620fce8be898406dd3ed6adc64c" +dependencies = [ + "async-io", + "async-lock", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix 1.1.4", + "signal-hook-registry", + "slab", + "windows-sys 0.61.2", +] + +[[package]] +name = "async-task" +version = "4.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" + +[[package]] +name = "async-trait" +version = "0.1.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "atspi" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c83247582e7508838caf5f316c00791eee0e15c0bf743e6880585b867e16815c" +dependencies = [ + "atspi-common", + "atspi-connection", + "atspi-proxies", +] + +[[package]] +name = "atspi-common" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33dfc05e7cdf90988a197803bf24f5788f94f7c94a69efa95683e8ffe76cfdfb" +dependencies = [ + "enumflags2", + "serde", + "static_assertions", + "zbus", + "zbus-lockstep", + "zbus-lockstep-macros", + "zbus_names", + "zvariant", +] + +[[package]] +name = "atspi-connection" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4193d51303d8332304056ae0004714256b46b6635a5c556109b319c0d3784938" +dependencies = [ + "atspi-common", + "atspi-proxies", + "futures-lite", + "zbus", +] + +[[package]] +name = "atspi-proxies" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2eebcb9e7e76f26d0bcfd6f0295e1cd1e6f33bedbc5698a971db8dc43d7751c" +dependencies = [ + "atspi-common", + "serde", + "zbus", +] + [[package]] name = "autocfg" version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" + +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + +[[package]] +name = "block2" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" +dependencies = [ + "objc2 0.5.2", +] + +[[package]] +name = "block2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" +dependencies = [ + "objc2 0.6.4", +] + +[[package]] +name = "blocking" +version = "1.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" +dependencies = [ + "async-channel", + "async-task", + "futures-io", + "futures-lite", + "piper", +] + +[[package]] +name = "bumpalo" +version = "3.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" + +[[package]] +name = "bytemuck" +version = "1.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "byteorder-lite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" + +[[package]] +name = "bytes" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" + +[[package]] +name = "calloop" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec" +dependencies = [ + "bitflags 2.11.0", + "log", + "polling", + "rustix 0.38.44", + "slab", + "thiserror 1.0.69", +] + +[[package]] +name = "calloop" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dbf9978365bac10f54d1d4b04f7ce4427e51f71d61f2fe15e3fed5166474df7" +dependencies = [ + "bitflags 2.11.0", + "polling", + "rustix 1.1.4", + "slab", + "tracing", +] + +[[package]] +name = "calloop-wayland-source" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95a66a987056935f7efce4ab5668920b5d0dac4a7c99991a67395f13702ddd20" +dependencies = [ + "calloop 0.13.0", + "rustix 0.38.44", + "wayland-backend", + "wayland-client", +] + +[[package]] +name = "calloop-wayland-source" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "138efcf0940a02ebf0cc8d1eff41a1682a46b431630f4c52450d6265876021fa" +dependencies = [ + "calloop 0.14.4", + "rustix 1.1.4", + "wayland-backend", + "wayland-client", +] + +[[package]] +name = "cc" +version = "1.2.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aebf35691d1bfb0ac386a69bac2fde4dd276fb618cf8bf4f5318fe285e821bb2" +dependencies = [ + "find-msvc-tools", + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "cgl" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ced0551234e87afee12411d535648dd89d2e7f34c78b753395567aff3d447ff" +dependencies = [ + "libc", +] + +[[package]] +name = "chacha20" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f8d983286843e49675a4b7a2d174efe136dc93a18d69130dd18198a6c167601" +dependencies = [ + "cfg-if", + "cpufeatures", + "rand_core 0.10.0", +] + +[[package]] +name = "clipboard-win" +version = "5.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bde03770d3df201d4fb868f2c9c59e66a3e4e2bd06692a0fe701e7103c7e84d4" +dependencies = [ + "error-code", +] + +[[package]] +name = "codespan-reporting" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe6d2e5af09e8c8ad56c969f2157a3d4238cebc7c55f0a517728c38f7b200f81" +dependencies = [ + "serde", + "termcolor", + "unicode-width", +] + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "core-graphics" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" +dependencies = [ + "bitflags 1.3.2", + "core-foundation 0.9.4", + "core-graphics-types 0.1.3", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" +dependencies = [ + "bitflags 1.3.2", + "core-foundation 0.9.4", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" +dependencies = [ + "bitflags 2.11.0", + "core-foundation 0.10.1", + "libc", +] + +[[package]] +name = "coreaudio-rs" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d15c3c3cee7c087938f7ad1c3098840b3ef1f1bdc7f6e496336c3b1e7a6f3914" +dependencies = [ + "bitflags 2.11.0", + "libc", + "objc2-audio-toolbox", + "objc2-core-audio", + "objc2-core-audio-types", + "objc2-core-foundation", +] + +[[package]] +name = "cpal" +version = "0.17.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8942da362c0f0d895d7cac616263f2f9424edc5687364dfd1d25ef7eba506d7" +dependencies = [ + "alsa", + "coreaudio-rs", + "dasp_sample", + "jni", + "js-sys", + "libc", + "mach2", + "ndk", + "ndk-context", + "num-derive", + "num-traits", + "objc2 0.6.4", + "objc2-audio-toolbox", + "objc2-avf-audio", + "objc2-core-audio", + "objc2-core-audio-types", + "objc2-core-foundation", + "objc2-foundation 0.3.2", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows 0.61.3", +] + +[[package]] +name = "cpufeatures" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + [[package]] name = "crossbeam-utils" version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" +[[package]] +name = "crunchy" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" + +[[package]] +name = "cursor-icon" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f27ae1dd37df86211c42e150270f82743308803d90a6f6e6651cd730d5e1732f" + +[[package]] +name = "dasp_sample" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c87e182de0887fd5361989c677c4e8f5000cd9491d6d563161a8f3a5519fc7f" + +[[package]] +name = "dispatch" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" + +[[package]] +name = "dispatch2" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" +dependencies = [ + "bitflags 2.11.0", + "objc2 0.6.4", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "dlib" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab8ecd87370524b461f8557c119c405552c396ed91fc0a8eec68679eab26f94a" +dependencies = [ + "libloading", +] + +[[package]] +name = "document-features" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" +dependencies = [ + "litrs", +] + +[[package]] +name = "downcast-rs" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" + +[[package]] +name = "dpi" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" + +[[package]] +name = "ecolor" +version = "0.33.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71ddb8ac7643d1dba1bb02110e804406dd459a838efcb14011ced10556711a8e" +dependencies = [ + "bytemuck", + "emath", +] + +[[package]] +name = "eframe" +version = "0.33.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "457481173e6db5ca9fa2be93a58df8f4c7be639587aeb4853b526c6cf87db4e6" +dependencies = [ + "ahash", + "bytemuck", + "document-features", + "egui", + "egui-wgpu", + "egui-winit", + "egui_glow", + "glow", + "glutin", + "glutin-winit", + "image", + "js-sys", + "log", + "objc2 0.5.2", + "objc2-app-kit 0.2.2", + "objc2-foundation 0.2.2", + "parking_lot", + "percent-encoding", + "profiling", + "raw-window-handle", + "static_assertions", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "web-time", + "windows-sys 0.61.2", + "winit", +] + +[[package]] +name = "egui" +version = "0.33.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a9b567d356674e9a5121ed3fedfb0a7c31e059fe71f6972b691bcd0bfc284e3" +dependencies = [ + "accesskit", + "ahash", + "bitflags 2.11.0", + "emath", + "epaint", + "log", + "nohash-hasher", + "profiling", + "smallvec", + "unicode-segmentation", +] + +[[package]] +name = "egui-wgpu" +version = "0.33.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e4d209971c84b2352a06174abdba701af1e552ce56b144d96f2bd50a3c91236" +dependencies = [ + "ahash", + "bytemuck", + "document-features", + "egui", + "epaint", + "log", + "profiling", + "thiserror 2.0.18", + "type-map", + "web-time", + "wgpu", + "winit", +] + +[[package]] +name = "egui-winit" +version = "0.33.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec6687e5bb551702f4ad10ac428bab12acf9d53047ebb1082d4a0ed8c6251a29" +dependencies = [ + "accesskit_winit", + "arboard", + "bytemuck", + "egui", + "log", + "objc2 0.5.2", + "objc2-foundation 0.2.2", + "objc2-ui-kit", + "profiling", + "raw-window-handle", + "smithay-clipboard", + "web-time", + "webbrowser", + "winit", +] + +[[package]] +name = "egui_glow" +version = "0.33.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6420863ea1d90e750f75075231a260030ad8a9f30a7cef82cdc966492dc4c4eb" +dependencies = [ + "bytemuck", + "egui", + "glow", + "log", + "memoffset", + "profiling", + "wasm-bindgen", + "web-sys", + "winit", +] + +[[package]] +name = "egui_plot" +version = "0.34.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67fc9b427a837264e55381a5cade6e28fe83ac5b165a61b9c888548c732a9c95" +dependencies = [ + "ahash", + "egui", + "emath", +] + +[[package]] +name = "emath" +version = "0.33.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "491bdf728bf25ddd9ad60d4cf1c48588fa82c013a2440b91aa7fc43e34a07c32" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "endi" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099" + +[[package]] +name = "enumflags2" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef" +dependencies = [ + "enumflags2_derive", + "serde", +] + +[[package]] +name = "enumflags2_derive" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "epaint" +version = "0.33.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "009d0dd3c2163823a0abdb899451ecbc78798dec545ee91b43aff1fa790bab62" +dependencies = [ + "ab_glyph", + "ahash", + "bytemuck", + "ecolor", + "emath", + "epaint_default_fonts", + "log", + "nohash-hasher", + "parking_lot", + "profiling", +] + +[[package]] +name = "epaint_default_fonts" +version = "0.33.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c4fbe202b6578d3d56428fa185cdf114a05e49da05f477b3c7f0fbb221f1862" + [[package]] name = "equivalent" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "error-code" +version = "3.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dea2df4cf52843e0452895c455a1a2cfbb842a1e7329671acf418fdc53ed4c59" + +[[package]] +name = "event-listener" +version = "5.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" +dependencies = [ + "event-listener", + "pin-project-lite", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "fax" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f05de7d48f37cd6730705cbca900770cab77a89f413d23e100ad7fad7795a0ab" +dependencies = [ + "fax_derive", +] + +[[package]] +name = "fax_derive" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0aca10fb742cb43f9e7bb8467c91aa9bcb8e3ffbc6a6f7389bb93ffc920577d" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "fdeflate" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + [[package]] name = "fixedbitset" version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" +[[package]] +name = "flate2" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + [[package]] name = "foldhash" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "fuchsia-cprng" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" + +[[package]] +name = "futures-core" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" + +[[package]] +name = "futures-io" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" + +[[package]] +name = "futures-lite" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + +[[package]] +name = "futures-macro" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-task" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" + +[[package]] +name = "futures-util" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +dependencies = [ + "futures-core", + "futures-macro", + "futures-task", + "pin-project-lite", + "slab", +] + +[[package]] +name = "gethostname" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8" +dependencies = [ + "rustix 1.1.4", + "windows-link 0.2.1", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi 5.3.0", + "wasip2", +] + +[[package]] +name = "getrandom" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" +dependencies = [ + "cfg-if", + "libc", + "r-efi 6.0.0", + "rand_core 0.10.0", + "wasip2", + "wasip3", +] + +[[package]] +name = "gl_generator" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d" +dependencies = [ + "khronos_api", + "log", + "xml-rs", +] + +[[package]] +name = "glow" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5e5ea60d70410161c8bf5da3fdfeaa1c72ed2c15f8bbb9d19fe3a4fad085f08" +dependencies = [ + "js-sys", + "slotmap", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "glutin" +version = "0.32.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12124de845cacfebedff80e877bb37b5b75c34c5a4c89e47e1cdd67fb6041325" +dependencies = [ + "bitflags 2.11.0", + "cfg_aliases", + "cgl", + "dispatch2", + "glutin_egl_sys", + "glutin_glx_sys", + "glutin_wgl_sys", + "libloading", + "objc2 0.6.4", + "objc2-app-kit 0.3.2", + "objc2-core-foundation", + "objc2-foundation 0.3.2", + "once_cell", + "raw-window-handle", + "wayland-sys", + "windows-sys 0.52.0", + "x11-dl", +] + +[[package]] +name = "glutin-winit" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85edca7075f8fc728f28cb8fbb111a96c3b89e930574369e3e9c27eb75d3788f" +dependencies = [ + "cfg_aliases", + "glutin", + "raw-window-handle", + "winit", +] + +[[package]] +name = "glutin_egl_sys" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c4680ba6195f424febdc3ba46e7a42a0e58743f2edb115297b86d7f8ecc02d2" +dependencies = [ + "gl_generator", + "windows-sys 0.52.0", +] + +[[package]] +name = "glutin_glx_sys" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7bb2938045a88b612499fbcba375a77198e01306f52272e692f8c1f3751185" +dependencies = [ + "gl_generator", + "x11-dl", +] + +[[package]] +name = "glutin_wgl_sys" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c4ee00b289aba7a9e5306d57c2d05499b2e5dc427f84ac708bd2c090212cf3e" +dependencies = [ + "gl_generator", +] + +[[package]] +name = "gpu-alloc" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" +dependencies = [ + "bitflags 2.11.0", + "gpu-alloc-types", +] + +[[package]] +name = "gpu-alloc-types" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" +dependencies = [ + "bitflags 2.11.0", +] + +[[package]] +name = "gpu-allocator" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c151a2a5ef800297b4e79efa4f4bec035c5f51d5ae587287c9b952bdf734cacd" +dependencies = [ + "log", + "presser", + "thiserror 1.0.69", + "windows 0.58.0", +] + +[[package]] +name = "gpu-descriptor" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b89c83349105e3732062a895becfc71a8f921bb71ecbbdd8ff99263e3b53a0ca" +dependencies = [ + "bitflags 2.11.0", + "gpu-descriptor-types", + "hashbrown 0.15.5", +] + +[[package]] +name = "gpu-descriptor-types" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdf242682df893b86f33a73828fb09ca4b2d3bb6cc95249707fc684d27484b91" +dependencies = [ + "bitflags 2.11.0", +] + +[[package]] +name = "half" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" +dependencies = [ + "cfg-if", + "crunchy", + "num-traits", + "zerocopy", +] + [[package]] name = "hashbrown" version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ - "foldhash", + "foldhash 0.1.5", ] [[package]] @@ -46,6 +1481,161 @@ name = "hashbrown" version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +dependencies = [ + "foldhash 0.2.0", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hexf-parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" + +[[package]] +name = "hound" +version = "3.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62adaabb884c94955b19907d60019f4e145d091c75345379e70d1ee696f7854f" + +[[package]] +name = "icu_collections" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" + +[[package]] +name = "icu_properties" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" + +[[package]] +name = "icu_provider" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "id-arena" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "image" +version = "0.25.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6506c6c10786659413faa717ceebcb8f70731c0a60cbae39795fdf114519c1a" +dependencies = [ + "bytemuck", + "byteorder-lite", + "moxcms", + "num-traits", + "png", + "tiff", +] [[package]] name = "indexmap" @@ -55,16 +1645,310 @@ checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" dependencies = [ "equivalent", "hashbrown 0.16.1", + "serde", + "serde_core", ] +[[package]] +name = "itoa" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" + +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys", + "log", + "thiserror 1.0.69", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + +[[package]] +name = "jobserver" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +dependencies = [ + "getrandom 0.3.4", + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.91" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b49715b7073f385ba4bc528e5747d02e66cb39c6146efb66b781f131f0fb399c" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "khronos-egl" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60416fdf76" +dependencies = [ + "libc", + "libloading", + "pkg-config", +] + +[[package]] +name = "khronos_api" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" + +[[package]] +name = "leb128fmt" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" + +[[package]] +name = "libc" +version = "0.2.182" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6800badb6cb2082ffd7b6a67e6125bb39f18782f793520caee8cb8846be06112" + +[[package]] +name = "libloading" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" +dependencies = [ + "cfg-if", + "windows-link 0.2.1", +] + +[[package]] +name = "libm" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" + +[[package]] +name = "libredox" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1744e39d1d6a9948f4f388969627434e31128196de472883b39f148769bfe30a" +dependencies = [ + "bitflags 2.11.0", + "libc", + "plain", + "redox_syscall 0.7.3", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + +[[package]] +name = "linux-raw-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" + +[[package]] +name = "litemap" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" + +[[package]] +name = "litrs" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" + +[[package]] +name = "mach2" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a1b95cd5421ec55b445b5ae102f5ea0e768de1f82bd3001e11f426c269c3aea" +dependencies = [ + "libc", +] + +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + +[[package]] +name = "memchr" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" + +[[package]] +name = "memmap2" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "714098028fe011992e1c3962653c96b2d578c4b4bce9036e15ff220319b1e0e3" +dependencies = [ + "libc", +] + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "metal" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00c15a6f673ff72ddcc22394663290f870fb224c1bfce55734a75c414150e605" +dependencies = [ + "bitflags 2.11.0", + "block", + "core-graphics-types 0.2.0", + "foreign-types", + "log", + "objc", + "paste", +] + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "moxcms" +version = "0.7.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac9557c559cd6fc9867e122e20d2cbefc9ca29d80d027a8e39310920ed2f0a97" +dependencies = [ + "num-traits", + "pxfm", +] + +[[package]] +name = "naga" +version = "27.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "066cf25f0e8b11ee0df221219010f213ad429855f57c494f995590c861a9a7d8" +dependencies = [ + "arrayvec", + "bit-set", + "bitflags 2.11.0", + "cfg-if", + "cfg_aliases", + "codespan-reporting", + "half", + "hashbrown 0.16.1", + "hexf-parse", + "indexmap", + "libm", + "log", + "num-traits", + "once_cell", + "rustc-hash 1.1.0", + "spirv", + "thiserror 2.0.18", + "unicode-ident", +] + +[[package]] +name = "ndk" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" +dependencies = [ + "bitflags 2.11.0", + "jni-sys", + "log", + "ndk-sys", + "num_enum", + "raw-window-handle", + "thiserror 1.0.69", +] + +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[package]] +name = "ndk-sys" +version = "0.6.0+11769913" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" +dependencies = [ + "jni-sys", +] + +[[package]] +name = "nohash-hasher" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" + [[package]] name = "ntw" version = "0.1.0" dependencies = [ + "cpal", + "eframe", + "egui", + "egui_plot", + "hound", "ntw_dsp", "ntw_flowgraph", "ntw_flowgraph_macros", + "num", + "rand 0.10.0", "ringbuf", + "rng", + "rustfft", ] [[package]] @@ -74,6 +1958,8 @@ dependencies = [ "ntw_flowgraph", "ntw_flowgraph_macros", "num", + "ringbuf", + "rustfft", ] [[package]] @@ -127,6 +2013,17 @@ dependencies = [ "num-traits", ] +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "num-integer" version = "0.1.46" @@ -165,8 +2062,448 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", + "libm", ] +[[package]] +name = "num_enum" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c" +dependencies = [ + "num_enum_derive", + "rustversion", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "objc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +dependencies = [ + "malloc_buf", +] + +[[package]] +name = "objc-sys" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" + +[[package]] +name = "objc2" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" +dependencies = [ + "objc-sys", + "objc2-encode", +] + +[[package]] +name = "objc2" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f" +dependencies = [ + "objc2-encode", +] + +[[package]] +name = "objc2-app-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" +dependencies = [ + "bitflags 2.11.0", + "block2 0.5.1", + "libc", + "objc2 0.5.2", + "objc2-core-data", + "objc2-core-image", + "objc2-foundation 0.2.2", + "objc2-quartz-core", +] + +[[package]] +name = "objc2-app-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" +dependencies = [ + "bitflags 2.11.0", + "objc2 0.6.4", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation 0.3.2", +] + +[[package]] +name = "objc2-audio-toolbox" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6948501a91121d6399b79abaa33a8aa4ea7857fe019f341b8c23ad6e81b79b08" +dependencies = [ + "bitflags 2.11.0", + "libc", + "objc2 0.6.4", + "objc2-core-audio", + "objc2-core-audio-types", + "objc2-core-foundation", + "objc2-foundation 0.3.2", +] + +[[package]] +name = "objc2-avf-audio" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13a380031deed8e99db00065c45937da434ca987c034e13b87e4441f9e4090be" +dependencies = [ + "objc2 0.6.4", + "objc2-foundation 0.3.2", +] + +[[package]] +name = "objc2-cloud-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009" +dependencies = [ + "bitflags 2.11.0", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-core-location", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-contacts" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5ff520e9c33812fd374d8deecef01d4a840e7b41862d849513de77e44aa4889" +dependencies = [ + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-core-audio" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1eebcea8b0dbff5f7c8504f3107c68fc061a3eb44932051c8cf8a68d969c3b2" +dependencies = [ + "dispatch2", + "objc2 0.6.4", + "objc2-core-audio-types", + "objc2-core-foundation", + "objc2-foundation 0.3.2", +] + +[[package]] +name = "objc2-core-audio-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a89f2ec274a0cf4a32642b2991e8b351a404d290da87bb6a9a9d8632490bd1c" +dependencies = [ + "bitflags 2.11.0", + "objc2 0.6.4", +] + +[[package]] +name = "objc2-core-data" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" +dependencies = [ + "bitflags 2.11.0", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-core-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" +dependencies = [ + "bitflags 2.11.0", + "block2 0.6.2", + "dispatch2", + "libc", + "objc2 0.6.4", +] + +[[package]] +name = "objc2-core-graphics" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" +dependencies = [ + "bitflags 2.11.0", + "dispatch2", + "objc2 0.6.4", + "objc2-core-foundation", + "objc2-io-surface", +] + +[[package]] +name = "objc2-core-image" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" +dependencies = [ + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", + "objc2-metal", +] + +[[package]] +name = "objc2-core-location" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "000cfee34e683244f284252ee206a27953279d370e309649dc3ee317b37e5781" +dependencies = [ + "block2 0.5.1", + "objc2 0.5.2", + "objc2-contacts", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-encode" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" + +[[package]] +name = "objc2-foundation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" +dependencies = [ + "bitflags 2.11.0", + "block2 0.5.1", + "dispatch", + "libc", + "objc2 0.5.2", +] + +[[package]] +name = "objc2-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" +dependencies = [ + "bitflags 2.11.0", + "block2 0.6.2", + "libc", + "objc2 0.6.4", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-io-surface" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" +dependencies = [ + "bitflags 2.11.0", + "objc2 0.6.4", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-link-presentation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1a1ae721c5e35be65f01a03b6d2ac13a54cb4fa70d8a5da293d7b0020261398" +dependencies = [ + "block2 0.5.1", + "objc2 0.5.2", + "objc2-app-kit 0.2.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-metal" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" +dependencies = [ + "bitflags 2.11.0", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" +dependencies = [ + "bitflags 2.11.0", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", + "objc2-metal", +] + +[[package]] +name = "objc2-symbols" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a684efe3dec1b305badae1a28f6555f6ddd3bb2c2267896782858d5a78404dc" +dependencies = [ + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-ui-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" +dependencies = [ + "bitflags 2.11.0", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-cloud-kit", + "objc2-core-data", + "objc2-core-image", + "objc2-core-location", + "objc2-foundation 0.2.2", + "objc2-link-presentation", + "objc2-quartz-core", + "objc2-symbols", + "objc2-uniform-type-identifiers", + "objc2-user-notifications", +] + +[[package]] +name = "objc2-uniform-type-identifiers" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44fa5f9748dbfe1ca6c0b79ad20725a11eca7c2218bceb4b005cb1be26273bfe" +dependencies = [ + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-user-notifications" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3" +dependencies = [ + "bitflags 2.11.0", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-core-location", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "orbclient" +version = "0.3.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ad2c6bae700b7aa5d1cc30c59bdd3a1c180b09dbaea51e2ae2b8e1cf211fdd" +dependencies = [ + "libc", + "libredox", +] + +[[package]] +name = "ordered-float" +version = "5.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4779c6901a562440c3786d08192c6fbda7c1c2060edd10006b05ee35d10f2d" +dependencies = [ + "num-traits", +] + +[[package]] +name = "ordered-stream" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" +dependencies = [ + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "owned_ttf_parser" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36820e9051aca1014ddc75770aab4d68bc1e9e632f0f5627c4086bc216fb583b" +dependencies = [ + "ttf-parser", +] + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.5.18", + "smallvec", + "windows-link 0.2.1", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + [[package]] name = "petgraph" version = "0.8.3" @@ -179,6 +2516,82 @@ dependencies = [ "serde", ] +[[package]] +name = "pin-project" +version = "1.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1749c7ed4bcaf4c3d0a3efc28538844fb29bcdd7d2b67b2be7e20ba861ff517" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b20ed30f105399776b9c883e68e536ef602a16ae6f596d2c473591d6ad64c6" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "piper" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c835479a4443ded371d6c535cbfd8d31ad92c5d23ae9770a61bc155e4992a3c1" +dependencies = [ + "atomic-waker", + "fastrand", + "futures-io", +] + +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "plain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" + +[[package]] +name = "png" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" +dependencies = [ + "bitflags 2.11.0", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "polling" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi", + "pin-project-lite", + "rustix 1.1.4", + "windows-sys 0.61.2", +] + [[package]] name = "portable-atomic" version = "1.13.1" @@ -194,6 +2607,49 @@ dependencies = [ "portable-atomic", ] +[[package]] +name = "potential_utf" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +dependencies = [ + "zerovec", +] + +[[package]] +name = "presser" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8cf8e6a8aa66ce33f63993ffc4ea4271eb5b0530a9002db8455ea6050c77bfa" + +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn", +] + +[[package]] +name = "primal-check" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc0d895b311e3af9902528fbb8f928688abbd95872819320517cc24ca6b2bd08" +dependencies = [ + "num-integer", +] + +[[package]] +name = "proc-macro-crate" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" +dependencies = [ + "toml_edit", +] + [[package]] name = "proc-macro2" version = "1.0.106" @@ -203,6 +2659,43 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "profiling" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eb8486b569e12e2c32ad3e204dbaba5e4b5b216e9367044f25f1dba42341773" + +[[package]] +name = "pxfm" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5a041e753da8b807c9255f28de81879c78c876392ff2469cde94799b2896b9d" + +[[package]] +name = "quick-error" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" + +[[package]] +name = "quick-xml" +version = "0.38.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66c2058c55a409d601666cffe35f04333cf1013010882cec174a7467cd4e21c" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "quick-xml" +version = "0.39.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "958f21e8e7ceb5a1aa7fa87fab28e7c75976e0bfe7e23ff069e0a260f894067d" +dependencies = [ + "memchr", +] + [[package]] name = "quote" version = "1.0.45" @@ -212,6 +2705,127 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "rand" +version = "0.3.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64ac302d8f83c0c1974bf758f6b041c6c8ada916fbb44a609158ca8b064cc76c" +dependencies = [ + "libc", + "rand 0.4.6", +] + +[[package]] +name = "rand" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293" +dependencies = [ + "fuchsia-cprng", + "libc", + "rand_core 0.3.1", + "rdrand", + "winapi", +] + +[[package]] +name = "rand" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc266eb313df6c5c09c1c7b1fbe2510961e5bcd3add930c1e31f7ed9da0feff8" +dependencies = [ + "chacha20", + "getrandom 0.4.2", + "rand_core 0.10.0", +] + +[[package]] +name = "rand_core" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" +dependencies = [ + "rand_core 0.4.2", +] + +[[package]] +name = "rand_core" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" + +[[package]] +name = "rand_core" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c8d0fd677905edcbeedbf2edb6494d676f0e98d54d5cf9bda0b061cb8fb8aba" + +[[package]] +name = "range-alloc" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca45419789ae5a7899559e9512e58ca889e41f04f1f2445e9f4b290ceccd1d08" + +[[package]] +name = "raw-window-handle" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" + +[[package]] +name = "rdrand" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" +dependencies = [ + "rand_core 0.3.1", +] + +[[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_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags 2.11.0", +] + +[[package]] +name = "redox_syscall" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce70a74e890531977d37e532c34d45e9055d2409ed08ddba14529471ed0be16" +dependencies = [ + "bitflags 2.11.0", +] + +[[package]] +name = "renderdoc-sys" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" + [[package]] name = "ringbuf" version = "0.4.8" @@ -223,6 +2837,113 @@ dependencies = [ "portable-atomic-util", ] +[[package]] +name = "rng" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daa6bba2ae9b3232e194e86d9a407e28c5d02fdfb85ea0e7e2e60f4d1e78aff2" +dependencies = [ + "rand 0.3.23", +] + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustc-hash" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" + +[[package]] +name = "rustfft" +version = "6.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21db5f9893e91f41798c88680037dba611ca6674703c1a18601b01a72c8adb89" +dependencies = [ + "num-complex", + "num-integer", + "num-traits", + "primal-check", + "strength_reduce", + "transpose", +] + +[[package]] +name = "rustix" +version = "0.38.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +dependencies = [ + "bitflags 2.11.0", + "errno", + "libc", + "linux-raw-sys 0.4.15", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustix" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +dependencies = [ + "bitflags 2.11.0", + "errno", + "libc", + "linux-raw-sys 0.12.1", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "sctk-adwaita" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6277f0217056f77f1d8f49f2950ac6c278c0d607c45f5ee99328d792ede24ec" +dependencies = [ + "ab_glyph", + "log", + "memmap2", + "smithay-client-toolkit 0.19.2", + "tiny-skia", +] + +[[package]] +name = "semver" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" + [[package]] name = "serde" version = "1.0.228" @@ -230,6 +2951,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" dependencies = [ "serde_core", + "serde_derive", ] [[package]] @@ -252,6 +2974,178 @@ dependencies = [ "syn", ] +[[package]] +name = "serde_json" +version = "1.0.149" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_repr" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook-registry" +version = "1.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" +dependencies = [ + "errno", + "libc", +] + +[[package]] +name = "simd-adler32" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "slotmap" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdd58c3c93c3d278ca835519292445cb4b0d4dc59ccfdf7ceadaab3f8aeb4038" +dependencies = [ + "version_check", +] + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[package]] +name = "smithay-client-toolkit" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3457dea1f0eb631b4034d61d4d8c32074caa6cd1ab2d59f2327bd8461e2c0016" +dependencies = [ + "bitflags 2.11.0", + "calloop 0.13.0", + "calloop-wayland-source 0.3.0", + "cursor-icon", + "libc", + "log", + "memmap2", + "rustix 0.38.44", + "thiserror 1.0.69", + "wayland-backend", + "wayland-client", + "wayland-csd-frame", + "wayland-cursor", + "wayland-protocols", + "wayland-protocols-wlr", + "wayland-scanner", + "xkeysym", +] + +[[package]] +name = "smithay-client-toolkit" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0512da38f5e2b31201a93524adb8d3136276fa4fe4aafab4e1f727a82b534cc0" +dependencies = [ + "bitflags 2.11.0", + "calloop 0.14.4", + "calloop-wayland-source 0.4.1", + "cursor-icon", + "libc", + "log", + "memmap2", + "rustix 1.1.4", + "thiserror 2.0.18", + "wayland-backend", + "wayland-client", + "wayland-csd-frame", + "wayland-cursor", + "wayland-protocols", + "wayland-protocols-experimental", + "wayland-protocols-misc", + "wayland-protocols-wlr", + "wayland-scanner", + "xkeysym", +] + +[[package]] +name = "smithay-clipboard" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71704c03f739f7745053bde45fa203a46c58d25bc5c4efba1d9a60e9dba81226" +dependencies = [ + "libc", + "smithay-client-toolkit 0.20.0", + "wayland-backend", +] + +[[package]] +name = "smol_str" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead" +dependencies = [ + "serde", +] + +[[package]] +name = "spirv" +version = "0.3.0+sdk-1.3.268.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844" +dependencies = [ + "bitflags 2.11.0", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe895eb47f22e2ddd4dabc02bce419d2e643c8e3b585c78158b349195bc24d82" + +[[package]] +name = "strict-num" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" + [[package]] name = "syn" version = "2.0.117" @@ -263,8 +3157,1646 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tempfile" +version = "3.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82a72c767771b47409d2345987fda8628641887d5466101319899796367354a0" +dependencies = [ + "fastrand", + "getrandom 0.4.2", + "once_cell", + "rustix 1.1.4", + "windows-sys 0.61.2", +] + +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" +dependencies = [ + "thiserror-impl 2.0.18", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tiff" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af9605de7fee8d9551863fd692cce7637f548dbd9db9180fcc07ccc6d26c336f" +dependencies = [ + "fax", + "flate2", + "half", + "quick-error", + "weezl", + "zune-jpeg", +] + +[[package]] +name = "tiny-skia" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83d13394d44dae3207b52a326c0c85a8bf87f1541f23b0d143811088497b09ab" +dependencies = [ + "arrayref", + "arrayvec", + "bytemuck", + "cfg-if", + "log", + "tiny-skia-path", +] + +[[package]] +name = "tiny-skia-path" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c9e7fc0c2e86a30b117d0462aa261b72b7a99b7ebd7deb3a14ceda95c5bdc93" +dependencies = [ + "arrayref", + "bytemuck", + "strict-num", +] + +[[package]] +name = "tinystr" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "toml_datetime" +version = "1.0.0+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32c2555c699578a4f59f0cc68e5116c8d7cabbd45e1409b989d4be085b53f13e" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.25.4+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7193cbd0ce53dc966037f54351dbbcf0d5a642c7f0038c382ef9e677ce8c13f2" +dependencies = [ + "indexmap", + "toml_datetime", + "toml_parser", + "winnow", +] + +[[package]] +name = "toml_parser" +version = "1.0.9+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "702d4415e08923e7e1ef96cd5727c0dfed80b4d2fa25db9647fe5eb6f7c5a4c4" +dependencies = [ + "winnow", +] + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", +] + +[[package]] +name = "transpose" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ad61aed86bc3faea4300c7aee358b4c6d0c8d6ccc36524c96e4c92ccf26e77e" +dependencies = [ + "num-integer", + "strength_reduce", +] + +[[package]] +name = "ttf-parser" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" + +[[package]] +name = "type-map" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb30dbbd9036155e74adad6812e9898d03ec374946234fbcebd5dfc7b9187b90" +dependencies = [ + "rustc-hash 2.1.1", +] + +[[package]] +name = "uds_windows" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51b70b87d15e91f553711b40df3048faf27a7a04e01e0ddc0cf9309f0af7c2ca" +dependencies = [ + "memoffset", + "tempfile", + "windows-sys 0.61.2", +] + [[package]] name = "unicode-ident" version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" + +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + +[[package]] +name = "unicode-width" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "url" +version = "2.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "uuid" +version = "1.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a68d3c8f01c0cfa54a75291d83601161799e4a89a39e0929f4b0354d88757a37" +dependencies = [ + "js-sys", + "serde_core", + "wasm-bindgen", +] + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "wasip2" +version = "1.0.2+wasi-0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasip3" +version = "0.4.0+wasi-0.3.0-rc-2026-01-06" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.114" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6532f9a5c1ece3798cb1c2cfdba640b9b3ba884f5db45973a6f442510a87d38e" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9c5522b3a28661442748e09d40924dfb9ca614b21c00d3fd135720e48b67db8" +dependencies = [ + "cfg-if", + "futures-util", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.114" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18a2d50fcf105fb33bb15f00e7a77b772945a2ee45dcf454961fd843e74c18e6" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.114" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03ce4caeaac547cdf713d280eda22a730824dd11e6b8c3ca9e42247b25c631e3" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.114" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75a326b8c223ee17883a4251907455a2431acc2791c98c26279376490c378c16" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-encoder" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" +dependencies = [ + "leb128fmt", + "wasmparser", +] + +[[package]] +name = "wasm-metadata" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" +dependencies = [ + "anyhow", + "indexmap", + "wasm-encoder", + "wasmparser", +] + +[[package]] +name = "wasmparser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" +dependencies = [ + "bitflags 2.11.0", + "hashbrown 0.15.5", + "indexmap", + "semver", +] + +[[package]] +name = "wayland-backend" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa75f400b7f719bcd68b3f47cd939ba654cedeef690f486db71331eec4c6a406" +dependencies = [ + "cc", + "downcast-rs", + "rustix 1.1.4", + "scoped-tls", + "smallvec", + "wayland-sys", +] + +[[package]] +name = "wayland-client" +version = "0.31.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab51d9f7c071abeee76007e2b742499e535148035bb835f97aaed1338cf516c3" +dependencies = [ + "bitflags 2.11.0", + "rustix 1.1.4", + "wayland-backend", + "wayland-scanner", +] + +[[package]] +name = "wayland-csd-frame" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e" +dependencies = [ + "bitflags 2.11.0", + "cursor-icon", + "wayland-backend", +] + +[[package]] +name = "wayland-cursor" +version = "0.31.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b3298683470fbdc6ca40151dfc48c8f2fd4c41a26e13042f801f85002384091" +dependencies = [ + "rustix 1.1.4", + "wayland-client", + "xcursor", +] + +[[package]] +name = "wayland-protocols" +version = "0.32.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b23b5df31ceff1328f06ac607591d5ba360cf58f90c8fad4ac8d3a55a3c4aec7" +dependencies = [ + "bitflags 2.11.0", + "wayland-backend", + "wayland-client", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols-experimental" +version = "20250721.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40a1f863128dcaaec790d7b4b396cc9b9a7a079e878e18c47e6c2d2c5a8dcbb1" +dependencies = [ + "bitflags 2.11.0", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols-misc" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "429b99200febaf95d4f4e46deff6fe4382bcff3280ee16a41cf887b3c3364984" +dependencies = [ + "bitflags 2.11.0", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols-plasma" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d392fc283a87774afc9beefcd6f931582bb97fe0e6ced0b306a62cb1d026527c" +dependencies = [ + "bitflags 2.11.0", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols-wlr" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78248e4cc0eff8163370ba5c158630dcae1f3497a586b826eca2ef5f348d6235" +dependencies = [ + "bitflags 2.11.0", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-scanner", +] + +[[package]] +name = "wayland-scanner" +version = "0.31.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c86287151a309799b821ca709b7345a048a2956af05957c89cb824ab919fa4e3" +dependencies = [ + "proc-macro2", + "quick-xml 0.39.2", + "quote", +] + +[[package]] +name = "wayland-sys" +version = "0.31.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "374f6b70e8e0d6bf9461a32988fd553b59ff630964924dad6e4a4eb6bd538d17" +dependencies = [ + "dlib", + "log", + "once_cell", + "pkg-config", +] + +[[package]] +name = "web-sys" +version = "0.3.91" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "854ba17bb104abfb26ba36da9729addc7ce7f06f5c0f90f3c391f8461cca21f9" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webbrowser" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f00bb839c1cf1e3036066614cbdcd035ecf215206691ea646aa3c60a24f68f2" +dependencies = [ + "core-foundation 0.10.1", + "jni", + "log", + "ndk-context", + "objc2 0.6.4", + "objc2-foundation 0.3.2", + "url", + "web-sys", +] + +[[package]] +name = "weezl" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88" + +[[package]] +name = "wgpu" +version = "27.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfe68bac7cde125de7a731c3400723cadaaf1703795ad3f4805f187459cd7a77" +dependencies = [ + "arrayvec", + "bitflags 2.11.0", + "cfg-if", + "cfg_aliases", + "document-features", + "hashbrown 0.16.1", + "js-sys", + "log", + "naga", + "parking_lot", + "portable-atomic", + "profiling", + "raw-window-handle", + "smallvec", + "static_assertions", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "wgpu-core", + "wgpu-hal", + "wgpu-types", +] + +[[package]] +name = "wgpu-core" +version = "27.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27a75de515543b1897b26119f93731b385a19aea165a1ec5f0e3acecc229cae7" +dependencies = [ + "arrayvec", + "bit-set", + "bit-vec", + "bitflags 2.11.0", + "bytemuck", + "cfg_aliases", + "document-features", + "hashbrown 0.16.1", + "indexmap", + "log", + "naga", + "once_cell", + "parking_lot", + "portable-atomic", + "profiling", + "raw-window-handle", + "rustc-hash 1.1.0", + "smallvec", + "thiserror 2.0.18", + "wgpu-core-deps-apple", + "wgpu-core-deps-emscripten", + "wgpu-core-deps-windows-linux-android", + "wgpu-hal", + "wgpu-types", +] + +[[package]] +name = "wgpu-core-deps-apple" +version = "27.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0772ae958e9be0c729561d5e3fd9a19679bcdfb945b8b1a1969d9bfe8056d233" +dependencies = [ + "wgpu-hal", +] + +[[package]] +name = "wgpu-core-deps-emscripten" +version = "27.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b06ac3444a95b0813ecfd81ddb2774b66220b264b3e2031152a4a29fda4da6b5" +dependencies = [ + "wgpu-hal", +] + +[[package]] +name = "wgpu-core-deps-windows-linux-android" +version = "27.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71197027d61a71748e4120f05a9242b2ad142e3c01f8c1b47707945a879a03c3" +dependencies = [ + "wgpu-hal", +] + +[[package]] +name = "wgpu-hal" +version = "27.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b21cb61c57ee198bc4aff71aeadff4cbb80b927beb912506af9c780d64313ce" +dependencies = [ + "android_system_properties", + "arrayvec", + "ash", + "bit-set", + "bitflags 2.11.0", + "block", + "bytemuck", + "cfg-if", + "cfg_aliases", + "core-graphics-types 0.2.0", + "glow", + "glutin_wgl_sys", + "gpu-alloc", + "gpu-allocator", + "gpu-descriptor", + "hashbrown 0.16.1", + "js-sys", + "khronos-egl", + "libc", + "libloading", + "log", + "metal", + "naga", + "ndk-sys", + "objc", + "once_cell", + "ordered-float", + "parking_lot", + "portable-atomic", + "portable-atomic-util", + "profiling", + "range-alloc", + "raw-window-handle", + "renderdoc-sys", + "smallvec", + "thiserror 2.0.18", + "wasm-bindgen", + "web-sys", + "wgpu-types", + "windows 0.58.0", + "windows-core 0.58.0", +] + +[[package]] +name = "wgpu-types" +version = "27.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afdcf84c395990db737f2dd91628706cb31e86d72e53482320d368e52b5da5eb" +dependencies = [ + "bitflags 2.11.0", + "bytemuck", + "js-sys", + "log", + "thiserror 2.0.18", + "web-sys", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd04d41d93c4992d421894c18c8b43496aa748dd4c081bac0dc93eb0489272b6" +dependencies = [ + "windows-core 0.58.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows" +version = "0.61.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" +dependencies = [ + "windows-collections", + "windows-core 0.61.2", + "windows-future", + "windows-link 0.1.3", + "windows-numerics", +] + +[[package]] +name = "windows-collections" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" +dependencies = [ + "windows-core 0.61.2", +] + +[[package]] +name = "windows-core" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ba6d44ec8c2591c134257ce647b7ea6b20335bf6379a27dac5f1641fcf59f99" +dependencies = [ + "windows-implement 0.58.0", + "windows-interface 0.58.0", + "windows-result 0.2.0", + "windows-strings 0.1.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-core" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +dependencies = [ + "windows-implement 0.60.2", + "windows-interface 0.59.3", + "windows-link 0.1.3", + "windows-result 0.3.4", + "windows-strings 0.4.2", +] + +[[package]] +name = "windows-future" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", + "windows-threading", +] + +[[package]] +name = "windows-implement" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.58.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-numerics" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", +] + +[[package]] +name = "windows-result" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result 0.2.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link 0.2.1", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", +] + +[[package]] +name = "windows-threading" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + +[[package]] +name = "winit" +version = "0.30.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6755fa58a9f8350bd1e472d4c3fcc25f824ec358933bba33306d0b63df5978d" +dependencies = [ + "ahash", + "android-activity", + "atomic-waker", + "bitflags 2.11.0", + "block2 0.5.1", + "bytemuck", + "calloop 0.13.0", + "cfg_aliases", + "concurrent-queue", + "core-foundation 0.9.4", + "core-graphics", + "cursor-icon", + "dpi", + "js-sys", + "libc", + "memmap2", + "ndk", + "objc2 0.5.2", + "objc2-app-kit 0.2.2", + "objc2-foundation 0.2.2", + "objc2-ui-kit", + "orbclient", + "percent-encoding", + "pin-project", + "raw-window-handle", + "redox_syscall 0.4.1", + "rustix 0.38.44", + "sctk-adwaita", + "smithay-client-toolkit 0.19.2", + "smol_str", + "tracing", + "unicode-segmentation", + "wasm-bindgen", + "wasm-bindgen-futures", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-protocols-plasma", + "web-sys", + "web-time", + "windows-sys 0.52.0", + "x11-dl", + "x11rb", + "xkbcommon-dl", +] + +[[package]] +name = "winnow" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" +dependencies = [ + "memchr", +] + +[[package]] +name = "wit-bindgen" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" +dependencies = [ + "wit-bindgen-rust-macro", +] + +[[package]] +name = "wit-bindgen-core" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" +dependencies = [ + "anyhow", + "heck", + "wit-parser", +] + +[[package]] +name = "wit-bindgen-rust" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" +dependencies = [ + "anyhow", + "heck", + "indexmap", + "prettyplease", + "syn", + "wasm-metadata", + "wit-bindgen-core", + "wit-component", +] + +[[package]] +name = "wit-bindgen-rust-macro" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" +dependencies = [ + "anyhow", + "prettyplease", + "proc-macro2", + "quote", + "syn", + "wit-bindgen-core", + "wit-bindgen-rust", +] + +[[package]] +name = "wit-component" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" +dependencies = [ + "anyhow", + "bitflags 2.11.0", + "indexmap", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder", + "wasm-metadata", + "wasmparser", + "wit-parser", +] + +[[package]] +name = "wit-parser" +version = "0.244.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" +dependencies = [ + "anyhow", + "id-arena", + "indexmap", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser", +] + +[[package]] +name = "writeable" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" + +[[package]] +name = "x11-dl" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +dependencies = [ + "libc", + "once_cell", + "pkg-config", +] + +[[package]] +name = "x11rb" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9993aa5be5a26815fe2c3eacfc1fde061fc1a1f094bf1ad2a18bf9c495dd7414" +dependencies = [ + "as-raw-xcb-connection", + "gethostname", + "libc", + "libloading", + "once_cell", + "rustix 1.1.4", + "x11rb-protocol", +] + +[[package]] +name = "x11rb-protocol" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea6fc2961e4ef194dcbfe56bb845534d0dc8098940c7e5c012a258bfec6701bd" + +[[package]] +name = "xcursor" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bec9e4a500ca8864c5b47b8b482a73d62e4237670e5b5f1d6b9e3cae50f28f2b" + +[[package]] +name = "xkbcommon-dl" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5" +dependencies = [ + "bitflags 2.11.0", + "dlib", + "log", + "once_cell", + "xkeysym", +] + +[[package]] +name = "xkeysym" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" + +[[package]] +name = "xml-rs" +version = "0.8.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ae8337f8a065cfc972643663ea4279e04e7256de865aa66fe25cec5fb912d3f" + +[[package]] +name = "yoke" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zbus" +version = "5.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca82f95dbd3943a40a53cfded6c2d0a2ca26192011846a1810c4256ef92c60bc" +dependencies = [ + "async-broadcast", + "async-executor", + "async-io", + "async-lock", + "async-process", + "async-recursion", + "async-task", + "async-trait", + "blocking", + "enumflags2", + "event-listener", + "futures-core", + "futures-lite", + "hex", + "libc", + "ordered-stream", + "rustix 1.1.4", + "serde", + "serde_repr", + "tracing", + "uds_windows", + "uuid", + "windows-sys 0.61.2", + "winnow", + "zbus_macros", + "zbus_names", + "zvariant", +] + +[[package]] +name = "zbus-lockstep" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6998de05217a084b7578728a9443d04ea4cd80f2a0839b8d78770b76ccd45863" +dependencies = [ + "zbus_xml", + "zvariant", +] + +[[package]] +name = "zbus-lockstep-macros" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10da05367f3a7b7553c8cdf8fa91aee6b64afebe32b51c95177957efc47ca3a0" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "zbus-lockstep", + "zbus_xml", + "zvariant", +] + +[[package]] +name = "zbus_macros" +version = "5.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897e79616e84aac4b2c46e9132a4f63b93105d54fe8c0e8f6bffc21fa8d49222" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", + "zbus_names", + "zvariant", + "zvariant_utils", +] + +[[package]] +name = "zbus_names" +version = "4.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffd8af6d5b78619bab301ff3c560a5bd22426150253db278f164d6cf3b72c50f" +dependencies = [ + "serde", + "winnow", + "zvariant", +] + +[[package]] +name = "zbus_xml" +version = "5.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "441a0064125265655bccc3a6af6bef56814d9277ac83fce48b1cd7e160b80eac" +dependencies = [ + "quick-xml 0.38.4", + "serde", + "zbus_names", + "zvariant", +] + +[[package]] +name = "zerocopy" +version = "0.8.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a789c6e490b576db9f7e6b6d661bcc9799f7c0ac8352f56ea20193b2681532e5" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f65c489a7071a749c849713807783f70672b28094011623e200cb86dcb835953" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zerotrie" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" + +[[package]] +name = "zune-core" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" + +[[package]] +name = "zune-jpeg" +version = "0.4.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29ce2c8a9384ad323cf564b67da86e21d3cfdff87908bc1223ed5c99bc792713" +dependencies = [ + "zune-core", +] + +[[package]] +name = "zvariant" +version = "5.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5708299b21903bbe348e94729f22c49c55d04720a004aa350f1f9c122fd2540b" +dependencies = [ + "endi", + "enumflags2", + "serde", + "winnow", + "zvariant_derive", + "zvariant_utils", +] + +[[package]] +name = "zvariant_derive" +version = "5.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b59b012ebe9c46656f9cc08d8da8b4c726510aef12559da3e5f1bf72780752c" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", + "zvariant_utils", +] + +[[package]] +name = "zvariant_utils" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f75c23a64ef8f40f13a6989991e643554d9bef1d682a281160cf0c1bc389c5e9" +dependencies = [ + "proc-macro2", + "quote", + "serde", + "syn", + "winnow", +] diff --git a/Cargo.toml b/Cargo.toml index 8f3a3e2..a796524 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,3 +8,12 @@ ntw_flowgraph = {path = "ntw_flowgraph"} ntw_flowgraph_macros = {path = "ntw_flowgraph_macros"} ntw_dsp = {path = "ntw_dsp"} ringbuf = "0.4.8" +num = "0.4.3" +hound = "3.5.1" +egui = "0.33.3" +eframe = "0.33.3" +egui_plot = "0.34.1" +cpal = {version = "0.17.3"} +rustfft = "6.4.1" +rng = "0.1.0" +rand = "0.10.0" diff --git a/graph.dot b/graph.dot new file mode 100644 index 0000000..966619f --- /dev/null +++ b/graph.dot @@ -0,0 +1,21 @@ +digraph { + 0 [ label = "\"FiniteIterSource\"" ] + 1 [ label = "\"Map\"" ] + 2 [ label = "\"ChannelSink\"" ] + 3 [ label = "\"ComplexNco\"" ] + 4 [ label = "\"ComplexOscillator\"" ] + 5 [ label = "\"Repeat\"" ] + 6 [ label = "\"Multiplier\"" ] + 7 [ label = "\"Tee\"" ] + 8 [ label = "\"Fft\"" ] + 9 [ label = "\"ChannelSink\"" ] + 0 -> 1 [ label = "()" ] + 1 -> 5 [ label = "()" ] + 3 -> 6 [ label = "()" ] + 4 -> 6 [ label = "()" ] + 5 -> 3 [ label = "()" ] + 6 -> 7 [ label = "()" ] + 7 -> 2 [ label = "()" ] + 7 -> 8 [ label = "()" ] + 8 -> 9 [ label = "()" ] +} diff --git a/mod.wav b/mod.wav new file mode 100644 index 0000000..e346693 Binary files /dev/null and b/mod.wav differ diff --git a/ntw_dsp/Cargo.lock b/ntw_dsp/Cargo.lock index b672c5b..9172e61 100644 --- a/ntw_dsp/Cargo.lock +++ b/ntw_dsp/Cargo.lock @@ -64,6 +64,8 @@ dependencies = [ "ntw_flowgraph", "ntw_flowgraph_macros", "num", + "ringbuf", + "rustfft", ] [[package]] @@ -184,6 +186,15 @@ dependencies = [ "portable-atomic", ] +[[package]] +name = "primal-check" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc0d895b311e3af9902528fbb8f928688abbd95872819320517cc24ca6b2bd08" +dependencies = [ + "num-integer", +] + [[package]] name = "proc-macro2" version = "1.0.106" @@ -213,6 +224,20 @@ dependencies = [ "portable-atomic-util", ] +[[package]] +name = "rustfft" +version = "6.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21db5f9893e91f41798c88680037dba611ca6674703c1a18601b01a72c8adb89" +dependencies = [ + "num-complex", + "num-integer", + "num-traits", + "primal-check", + "strength_reduce", + "transpose", +] + [[package]] name = "serde" version = "1.0.228" @@ -242,6 +267,12 @@ dependencies = [ "syn", ] +[[package]] +name = "strength_reduce" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe895eb47f22e2ddd4dabc02bce419d2e643c8e3b585c78158b349195bc24d82" + [[package]] name = "syn" version = "2.0.117" @@ -253,6 +284,16 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "transpose" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ad61aed86bc3faea4300c7aee358b4c6d0c8d6ccc36524c96e4c92ccf26e77e" +dependencies = [ + "num-integer", + "strength_reduce", +] + [[package]] name = "unicode-ident" version = "1.0.24" diff --git a/ntw_dsp/Cargo.toml b/ntw_dsp/Cargo.toml index 9ecf186..b08d1e2 100644 --- a/ntw_dsp/Cargo.toml +++ b/ntw_dsp/Cargo.toml @@ -7,3 +7,5 @@ edition = "2024" ntw_flowgraph = {path = "../ntw_flowgraph/"} ntw_flowgraph_macros = {path = "../ntw_flowgraph_macros/"} num = "0.4.3" +ringbuf = "0.4.8" +rustfft = "6.4.1" diff --git a/ntw_dsp/src/blocks.rs b/ntw_dsp/src/blocks.rs index 5b61997..951c2fa 100644 --- a/ntw_dsp/src/blocks.rs +++ b/ntw_dsp/src/blocks.rs @@ -1,5 +1,13 @@ pub mod complex; +pub mod early_late_gate; +pub mod fft; +pub mod fir; +pub mod iir; +pub mod iq; pub mod iter; pub mod map; +pub mod math; pub mod nco; +pub mod oscillator; pub mod tee; +pub mod utilities; diff --git a/ntw_dsp/src/blocks/complex.rs b/ntw_dsp/src/blocks/complex.rs index e731027..5c32e2c 100644 --- a/ntw_dsp/src/blocks/complex.rs +++ b/ntw_dsp/src/blocks/complex.rs @@ -1,5 +1,5 @@ -use ntw_flowgraph::Block; -use ntw_flowgraph::inout::{In, Out}; +use ntw_flowgraph::inout::In; +use ntw_flowgraph::inout::Out; use ntw_flowgraph_macros::Block; use num::Complex; diff --git a/ntw_dsp/src/blocks/early_late_gate.rs b/ntw_dsp/src/blocks/early_late_gate.rs new file mode 100644 index 0000000..fcf95b1 --- /dev/null +++ b/ntw_dsp/src/blocks/early_late_gate.rs @@ -0,0 +1,211 @@ +use std::collections::VecDeque; +use std::sync::mpsc::Sender; + +use ntw_flowgraph::BlockResult; +use ntw_flowgraph::BlockWork; +use ntw_flowgraph::inout::In; +use ntw_flowgraph::inout::Out; +use ntw_flowgraph::inout::Stream; +use ntw_flowgraph_macros::Block; +use num::Float; + +use crate::filtering::fir::Fir; +use crate::filtering::impulse_response::ImpulseResponse; + +#[derive(Clone, Copy)] +pub enum EarlyLateGateTag +{ + Symbol(T), + InterSymbol(T), +} + +#[derive(Block)] +pub struct EarlyLateGate +{ + #[input] + input: In, + + #[output] + output: Out>, + + symbol_length: usize, + + // Window looking at symbol_length samples at a time + window: VecDeque, + + // The current location of the window, in relation to the last sample + window_location: usize, + + window_center: usize, + + // The next window location, in relation to the last sample such that the window is centered on + // a symbol center (hopefully) + next_sample: usize, + loop_filter: Fir, +} + +impl EarlyLateGate +{ + pub fn new( + input: In, + loop_filter: ImpulseResponse, + symbol_length: usize, + ) -> (Self, In>) + { + let (output, samples) = Stream::make(1024); + ( + Self { + input, + output, + window: VecDeque::with_capacity(symbol_length), + symbol_length, + window_location: 0, + window_center: symbol_length / 2, + next_sample: symbol_length, // We assume that the first symbol is 1.5 windows into + // the stream + loop_filter: Fir::new(loop_filter), + }, + samples, + ) + } +} + +impl BlockWork for EarlyLateGate +{ + fn work(&mut self) -> ntw_flowgraph::BlockResult + { + // Handle begining, window is empty + if self.window.len() < self.symbol_length + { + self.input + .pop_iter() + .take(self.symbol_length - self.window.len()) + .for_each(|x| self.window.push_back(x)); + + if self.input.available_len() == 0 + { + return BlockResult::Ok; + } + } + + let max = self.input.available_len().min(self.output.vacant_len()); + for _ in 0..max + { + // Bring new sample in + self.window.pop_front(); + self.window.push_back(self.input.try_pop().unwrap()); + self.window_location += 1; + + let sample = self.window[self.window_center]; + if self.window_location >= self.next_sample + { + // Window is centered on a symbol + let _ = self.output.try_push(EarlyLateGateTag::Symbol(sample)); + + // Sample early and late samples + let early_index = self.window_center - (0.25 * self.symbol_length as f32) as usize; + let late_index = self.window_center + (0.25 * self.symbol_length as f32) as usize; + + let early_sample = self.window[early_index]; + let late_sample = self.window[late_index]; + + let error = (late_sample - early_sample) * sample; + let correction = self.loop_filter.next(error); + + // Figure out next sample location + self.next_sample += (self.symbol_length as isize + + correction.floor().to_isize().unwrap_or(0)) + .max(0) as usize; + + // Turn everything back relative to current sample + self.next_sample -= self.window_location; + self.window_location = 0; + } + else + { + // Window is not centered on a symbol + let _ = self.output.try_push(EarlyLateGateTag::InterSymbol(sample)); + } + } + + BlockResult::Ok + } + + fn ready(&mut self) -> bool + { + self.input.available_len() > 0 && self.output.vacant_len() > 0 + } +} + +#[derive(Block)] +pub struct EyeExtractor +{ + #[input] + input: In>, + + output: Sender>, + + window: VecDeque>, + symbol_length: usize, +} + +impl EyeExtractor +{ + pub fn new(input: In>, output: Sender>, symbol_length: usize) + -> Self + { + Self { + input, + output, + window: VecDeque::with_capacity(symbol_length), + symbol_length, + } + } +} + +impl BlockWork for EyeExtractor +{ + fn work(&mut self) -> BlockResult + { + // Handle begining, window is empty + if self.window.len() < self.symbol_length * 2 + { + self.input + .pop_iter() + .take(2 * self.symbol_length - self.window.len()) + .for_each(|x| self.window.push_back(x)); + + if self.input.available_len() == 0 + { + return BlockResult::Ok; + } + } + + for _ in 0..self.input.available_len() + { + let x = self.input.try_pop().unwrap(); + self.window.pop_front(); + self.window.push_back(x); + if let EarlyLateGateTag::Symbol(_) = self.window[self.symbol_length] + { + let vec = self + .window + .iter() + .cloned() + .map(|x| match x + { + EarlyLateGateTag::Symbol(x) | EarlyLateGateTag::InterSymbol(x) => x, + }) + .collect::>(); + let _ = self.output.send(vec); + } + } + + BlockResult::Ok + } + + fn ready(&mut self) -> bool + { + self.input.available_len() > 0 + } +} diff --git a/ntw_dsp/src/blocks/fft.rs b/ntw_dsp/src/blocks/fft.rs new file mode 100644 index 0000000..a7596e1 --- /dev/null +++ b/ntw_dsp/src/blocks/fft.rs @@ -0,0 +1,75 @@ +use ntw_flowgraph::BlockResult; +use ntw_flowgraph::BlockWork; +use ntw_flowgraph::inout::In; +use ntw_flowgraph::inout::Out; +use ntw_flowgraph::inout::Stream; +use ntw_flowgraph_macros::Block; +use num::Complex; +use rustfft::FftDirection; +use rustfft::FftNum; +use rustfft::FftPlanner; +use std::sync::Arc; + +#[derive(Block)] +pub struct Fft +where + T: FftNum, +{ + #[input] + input: In>, + + #[output] + output: Out>>, + + length: usize, + buffer: Vec>, + fft: Arc + 'static>, +} + +impl Fft +{ + pub fn new( + input: In>, + length: usize, + direction: FftDirection, + ) -> (Self, In>>) + { + let (output, ffts) = Stream::make(128); + let mut planner = FftPlanner::new(); + let fft = planner.plan_fft(length, direction); + ( + Self { + input, + output, + length, + buffer: Vec::with_capacity(length), + fft, + }, + ffts, + ) + } +} + +impl BlockWork for Fft +{ + fn work(&mut self) -> ntw_flowgraph::BlockResult + { + if self.buffer.len() >= self.length + { + // Compute fft + self.fft.process(self.buffer.as_mut_slice()); + let _ = self.output.try_push(self.buffer.clone()); + self.buffer.clear(); + } + + self.buffer + .extend(self.input.pop_iter().take(self.length - self.buffer.len())); + + BlockResult::Ok + } + + fn ready(&mut self) -> bool + { + self.input.available_len() > 0 && self.output.vacant_len() > 0 + } +} diff --git a/ntw_dsp/src/blocks/fir.rs b/ntw_dsp/src/blocks/fir.rs new file mode 100644 index 0000000..0807616 --- /dev/null +++ b/ntw_dsp/src/blocks/fir.rs @@ -0,0 +1,184 @@ +use std::ops::Add; +use std::ops::Mul; + +use crate::filtering::impulse_response; +use crate::filtering::impulse_response::ImpulseResponse; +use ntw_flowgraph::BlockResult; +use ntw_flowgraph::BlockWork; +use ntw_flowgraph::inout::In; +use ntw_flowgraph::inout::Out; +use ntw_flowgraph::inout::Stream; +use ntw_flowgraph_macros::Block; +use num::Complex; +use rustfft::FftDirection; +use rustfft::FftNum; +use rustfft::FftPlanner; +use std::sync::Arc; + +#[derive(Block)] +pub struct Fir +where + C: Clone, + V: Clone, + V: Mul, + U: Add, +{ + filter: crate::filtering::fir::Fir, + + #[input] + input: In, + + #[output] + output: Out, +} + +impl Fir +where + C: Clone, + V: Clone, + V: Mul, + U: Add, +{ + pub fn new(input: In, impulse_response: ImpulseResponse) -> (Fir, In) + { + let fir = crate::filtering::fir::Fir::new(impulse_response); + let (output, stream) = Stream::make(1024); + + ( + Self { + filter: fir, + input, + output, + }, + stream, + ) + } +} + +impl BlockWork for Fir +where + C: Clone, + V: Clone, + V: Mul, + U: Add, +{ + fn work(&mut self) -> BlockResult + { + self.output + .push_iter(self.input.pop_iter().map(|sample| self.filter.next(sample))); + BlockResult::Ok + } + + fn ready(&mut self) -> bool + { + self.input.available_len() > 0 && self.output.vacant_len() > 0 + } +} + +#[derive(Block)] +pub struct FirFft +where + T: FftNum, +{ + #[input] + input: In>, + + #[output] + output: Out>, + + length: usize, + buffer: Vec>, + transformed_ir: Vec>, + fft: Arc + 'static>, + ifft: Arc + 'static>, + accumulating: bool, +} + +impl FirFft +{ + pub fn new( + input: In>, + impulse_response: ImpulseResponse>, + ) -> (Self, In>) + { + let (output, filtered) = Stream::make(1024); + let length = impulse_response.len(); + let mut planner = FftPlanner::new(); + let fft = planner.plan_fft(impulse_response.len(), FftDirection::Forward); + let ifft = planner.plan_fft(impulse_response.len(), FftDirection::Inverse); + + let mut transformed_ir = impulse_response.0; + fft.process(&mut transformed_ir); + + ( + Self { + input, + output, + length, + buffer: Vec::with_capacity(length), + transformed_ir, + fft, + ifft, + accumulating: true, + }, + filtered, + ) + } +} + +impl BlockWork for FirFft +{ + fn work(&mut self) -> ntw_flowgraph::BlockResult + { + if self.accumulating + { + if self.buffer.len() >= self.length && self.accumulating + { + // Compute fft + self.fft.process(self.buffer.as_mut_slice()); + + // Convolve + self.buffer + .iter_mut() + .zip(self.transformed_ir.iter()) + .for_each(|(x, y)| *x = *x * *y); + + self.ifft.process(self.buffer.as_mut_slice()); + self.accumulating = false; + } + else + { + self.buffer + .extend(self.input.pop_iter().take(self.length - self.buffer.len())); + } + } + + if !self.accumulating + { + let len = self.output.vacant_len().min(self.buffer.len()); + for _ in 0..len + { + let _ = self.output.try_push(self.buffer.pop().unwrap()); + } + + if self.buffer.is_empty() + { + self.accumulating = true; + } + } + + BlockResult::Ok + } + + fn ready(&mut self) -> bool + { + if self.accumulating + { + self.input.available_len() > 0 + } + else + { + self.output.vacant_len() > 0 + } + } +} diff --git a/ntw_dsp/src/blocks/iir.rs b/ntw_dsp/src/blocks/iir.rs new file mode 100644 index 0000000..30e8399 --- /dev/null +++ b/ntw_dsp/src/blocks/iir.rs @@ -0,0 +1,58 @@ +use ntw_flowgraph::BlockResult; +use ntw_flowgraph::BlockWork; +use ntw_flowgraph::inout::In; +use ntw_flowgraph::inout::Out; +use ntw_flowgraph::inout::Stream; +use ntw_flowgraph_macros::Block; +use num::complex::ComplexFloat; + +#[derive(Block)] +pub struct SimpleDcBlock +{ + #[input] + input: In, + + #[output] + output: Out, + + prev_input: T, + prev_output: T, + r: T, +} + +impl SimpleDcBlock +{ + pub fn new(input: In, r: T) -> (Self, In) + { + let (output, dc_removed) = Stream::make(1024); + ( + Self { + input, + output, + prev_input: T::zero(), + prev_output: T::zero(), + r, + }, + dc_removed, + ) + } +} + +impl BlockWork for SimpleDcBlock +{ + fn work(&mut self) -> ntw_flowgraph::BlockResult + { + self.output.push_iter(self.input.pop_iter().map(|x| { + let out = x - self.prev_input + self.r * self.prev_output; + self.prev_input = x; + self.prev_output = out; + out + })); + BlockResult::Ok + } + + fn ready(&mut self) -> bool + { + self.input.available_len() > 0 && self.output.vacant_len() > 0 + } +} diff --git a/ntw_dsp/src/blocks/iq.rs b/ntw_dsp/src/blocks/iq.rs new file mode 100644 index 0000000..4163378 --- /dev/null +++ b/ntw_dsp/src/blocks/iq.rs @@ -0,0 +1,98 @@ +use std::f64::consts::PI; + +use ntw_flowgraph::BlockResult; +use ntw_flowgraph::BlockWork; +use ntw_flowgraph::inout::In; +use ntw_flowgraph::inout::Out; +use ntw_flowgraph::inout::Stream; +use ntw_flowgraph_macros::Block; +use num::Complex; +use num::Float; +use num::One; +use num::Zero; +use rustfft::FftNum; + +use crate::Frequency; +use crate::filtering::fir::Fir; +use crate::filtering::impulse_response::ImpulseResponse; +use crate::generation::Nco; +use crate::generation::NcoType; + +#[derive(Block)] +pub struct IqSampler +{ + #[input] + input: In, + + #[output] + output: Out>, + + bandpass_i: Fir, + bandpass_q: Fir, + local_oscillator: Nco, +} + +impl IqSampler +{ + pub fn new(input: In, local_oscillator_frequency: Frequency) -> (Self, In>) + { + let (output, iq) = Stream::make(1024); + let fir_len = 64; + let mut transfer_function = vec![Complex::::zero(); fir_len]; + let lobes_length = ((local_oscillator_frequency.as_rad() / PI) + * (transfer_function.len() as f64 / 2.)) + .floor() as usize; + + for i in 0..lobes_length + { + transfer_function[i] = Complex::::one(); + transfer_function[fir_len - i - 1] = Complex::::one(); + } + let ir = ImpulseResponse( + ImpulseResponse::from_transfer_function(&transfer_function) + .0 + .iter() + .map(|x| x.re) + .collect(), + ) + .normalized(); + + ( + Self { + input, + output, + bandpass_i: Fir::new(ir.clone()), + bandpass_q: Fir::new(ir), + local_oscillator: Nco::new(local_oscillator_frequency), + }, + iq, + ) + } +} + +impl BlockWork for IqSampler +{ + fn work(&mut self) -> ntw_flowgraph::BlockResult + { + self.output.push_iter( + &mut self + .input + .pop_iter() + .zip(&mut self.local_oscillator) + .map(|(x, lo)| { + Complex::new( + self.bandpass_i.next(x * lo.re), + self.bandpass_q.next(x * lo.im), + ) + //Complex::new(x * lo.re, x * lo.im) + }), + ); + + BlockResult::Ok + } + + fn ready(&mut self) -> bool + { + self.input.available_len() > 0 && self.output.vacant_len() > 0 + } +} diff --git a/ntw_dsp/src/blocks/iter.rs b/ntw_dsp/src/blocks/iter.rs index fcb0e32..1526c94 100644 --- a/ntw_dsp/src/blocks/iter.rs +++ b/ntw_dsp/src/blocks/iter.rs @@ -1,9 +1,10 @@ use std::iter::Peekable; -use ntw_flowgraph::{ - BlockWork, - inout::{In, Out, Stream}, -}; +use ntw_flowgraph::BlockResult; +use ntw_flowgraph::BlockWork; +use ntw_flowgraph::inout::In; +use ntw_flowgraph::inout::Out; +use ntw_flowgraph::inout::Stream; use ntw_flowgraph_macros::Block; #[derive(Block)] @@ -38,9 +39,10 @@ impl BlockWork for IterSource where I: Iterator, { - fn work(&mut self) + fn work(&mut self) -> BlockResult { self.output.push_iter(&mut self.iter); + BlockResult::Ok } fn ready(&mut self) -> bool @@ -48,3 +50,64 @@ where self.iter.peek().is_some() && self.output.vacant_len() > 0 } } + +#[derive(Block)] +pub struct FiniteIterSource +where + I: Iterator, +{ + iter: Peekable, + remaining: usize, + + #[output] + output: Out, +} + +impl FiniteIterSource +where + I: Iterator, +{ + pub fn new(iter: I, len: usize) -> (Self, In) + { + let (output, input) = Stream::make(1024); + ( + Self { + iter: iter.peekable(), + remaining: len, + output, + }, + input, + ) + } +} +impl FiniteIterSource +where + I: Iterator + ExactSizeIterator, +{ + pub fn from_len_iter(iter: I) -> (Self, In) + { + let len = iter.len(); + Self::new(iter, len) + } +} + +impl BlockWork for FiniteIterSource +where + I: Iterator, +{ + fn work(&mut self) -> BlockResult + { + self.remaining -= self.output.push_iter((&mut self.iter).take(self.remaining)); + + match self.remaining + { + 0 => BlockResult::Finished, + _ => BlockResult::Ok, + } + } + + fn ready(&mut self) -> bool + { + self.remaining > 0 && self.output.vacant_len() > 0 + } +} diff --git a/ntw_dsp/src/blocks/map.rs b/ntw_dsp/src/blocks/map.rs index f100084..7d29432 100644 --- a/ntw_dsp/src/blocks/map.rs +++ b/ntw_dsp/src/blocks/map.rs @@ -1,7 +1,8 @@ -use ntw_flowgraph::{ - Block, BlockWork, - inout::{In, Out, Stream}, -}; +use ntw_flowgraph::BlockResult; +use ntw_flowgraph::BlockWork; +use ntw_flowgraph::inout::In; +use ntw_flowgraph::inout::Out; +use ntw_flowgraph::inout::Stream; use ntw_flowgraph_macros::Block; #[derive(Block)] @@ -33,12 +34,13 @@ impl BlockWork for Map where F: Fn(I) -> O, { - fn work(&mut self) + fn work(&mut self) -> BlockResult { self.output.push_iter(self.input.pop_iter().map(&self.map)); + BlockResult::Ok } - fn ready(&self) -> bool + fn ready(&mut self) -> bool { self.input.available_len() > 0 && self.output.vacant_len() > 0 } diff --git a/ntw_dsp/src/blocks/math.rs b/ntw_dsp/src/blocks/math.rs new file mode 100644 index 0000000..c3a322e --- /dev/null +++ b/ntw_dsp/src/blocks/math.rs @@ -0,0 +1,60 @@ +use std::ops::Mul; + +use ntw_flowgraph::BlockResult; +use ntw_flowgraph::BlockWork; +use ntw_flowgraph::inout::In; +use ntw_flowgraph::inout::Out; +use ntw_flowgraph::inout::Stream; +use ntw_flowgraph_macros::Block; + +#[derive(Block)] +pub struct Multiplier +{ + #[input] + input_a: In, + + #[input] + input_b: In, + + #[output] + product: Out, +} + +impl Multiplier +{ + pub fn new(input_a: In, input_b: In) -> (Self, In) + { + let (product, stream) = Stream::make(1024); + ( + Multiplier { + input_a, + input_b, + product, + }, + stream, + ) + } +} + +impl BlockWork for Multiplier +where + A: Mul, +{ + fn work(&mut self) -> BlockResult + { + self.product.push_iter( + self.input_a + .pop_iter() + .zip(self.input_b.pop_iter()) + .map(|(a, b)| a * b), + ); + BlockResult::Ok + } + + fn ready(&mut self) -> bool + { + self.input_a.available_len() > 0 + && self.input_b.available_len() > 0 + && self.product.vacant_len() > 0 + } +} diff --git a/ntw_dsp/src/blocks/nco.rs b/ntw_dsp/src/blocks/nco.rs index 3fa2052..7243200 100644 --- a/ntw_dsp/src/blocks/nco.rs +++ b/ntw_dsp/src/blocks/nco.rs @@ -1,6 +1,8 @@ -use ntw_flowgraph::Block; -use ntw_flowgraph::inout::{In, Stream}; -use ntw_flowgraph::{BlockWork, inout::Out}; +use ntw_flowgraph::BlockResult; +use ntw_flowgraph::BlockWork; +use ntw_flowgraph::inout::In; +use ntw_flowgraph::inout::Out; +use ntw_flowgraph::inout::Stream; use ntw_flowgraph_macros::Block; use num::Complex; @@ -12,41 +14,65 @@ pub struct ComplexNco { inner: crate::generation::Nco, + #[input] + freq_in: In, + #[output] out: Out>, } impl BlockWork for ComplexNco { - fn work(&mut self) + fn work(&mut self) -> BlockResult { - self.out.push_iter(&mut self.inner); + let len = self.freq_in.available_len().min(self.out.vacant_len()); + for _ in 0..len + { + self.inner.set_frequency(self.freq_in.try_pop().unwrap()); + self.out.try_push(self.inner.sample()).unwrap(); + self.inner.next(); + } + BlockResult::Ok } - fn ready(&self) -> bool + fn ready(&mut self) -> bool { - self.out.vacant_len() > 0 + self.freq_in.available_len() > 0 && self.out.vacant_len() > 0 } } impl BlockWork for ComplexNco { - fn work(&mut self) + fn work(&mut self) -> BlockResult { - self.out.push_iter(&mut self.inner); + let len = self.freq_in.available_len().min(self.out.vacant_len()); + for _ in 0..len + { + self.inner.set_frequency(self.freq_in.try_pop().unwrap()); + self.out.try_push(self.inner.sample()).unwrap(); + self.inner.next(); + } + BlockResult::Ok } - fn ready(&self) -> bool + fn ready(&mut self) -> bool { - self.out.vacant_len() > 0 + self.freq_in.available_len() > 0 && self.out.vacant_len() > 0 } } impl ComplexNco { - pub fn new(nco: Nco) -> (Self, In>) + pub fn new(input_freq: In) -> (Self, In>) { let (a, b) = Stream::make(1024); - (Self { inner: nco, out: a }, b) + ( + Self { + inner: Nco::new(Frequency::from_rad(0.)), + freq_in: input_freq, + out: a, + }, + b, + ) } } diff --git a/ntw_dsp/src/blocks/oscillator.rs b/ntw_dsp/src/blocks/oscillator.rs new file mode 100644 index 0000000..b3423c1 --- /dev/null +++ b/ntw_dsp/src/blocks/oscillator.rs @@ -0,0 +1,55 @@ +use ntw_flowgraph::BlockResult; +use ntw_flowgraph::BlockWork; +use ntw_flowgraph::inout::In; +use ntw_flowgraph::inout::Out; +use ntw_flowgraph::inout::Stream; +use ntw_flowgraph_macros::Block; +use num::Complex; + +use crate::generation::Nco; + +#[derive(Block)] +pub struct ComplexOscillator +{ + inner: crate::generation::Nco, + + #[output] + out: Out>, +} + +impl BlockWork for ComplexOscillator +{ + fn work(&mut self) -> BlockResult + { + self.out.push_iter(&mut self.inner); + BlockResult::Ok + } + + fn ready(&mut self) -> bool + { + self.out.vacant_len() > 0 + } +} + +impl BlockWork for ComplexOscillator +{ + fn work(&mut self) -> BlockResult + { + self.out.push_iter(&mut self.inner); + BlockResult::Ok + } + + fn ready(&mut self) -> bool + { + self.out.vacant_len() > 0 + } +} + +impl ComplexOscillator +{ + pub fn new(nco: Nco) -> (Self, In>) + { + let (a, b) = Stream::make(1024); + (Self { inner: nco, out: a }, b) + } +} diff --git a/ntw_dsp/src/blocks/tee.rs b/ntw_dsp/src/blocks/tee.rs index 9d93ca0..9eb157d 100644 --- a/ntw_dsp/src/blocks/tee.rs +++ b/ntw_dsp/src/blocks/tee.rs @@ -1,17 +1,21 @@ +use ntw_flowgraph::BlockResult; +use ntw_flowgraph::BlockWork; +use ntw_flowgraph::inout::In; +use ntw_flowgraph::inout::Out; +use ntw_flowgraph::inout::Stream; use ntw_flowgraph_macros::Block; -use ntw_flowgraph::{Block, BlockWork, inout::{In, Out, Stream}}; #[derive(Block)] pub struct Tee { #[input] - input: In + input: In, #[output] - output_1: Out + output_1: Out, #[output] - output_2: Out + output_2: Out, } impl Tee @@ -21,37 +25,41 @@ impl Tee let (output_1, in_1) = Stream::make(1024); let (output_2, in_2) = Stream::make(1024); ( - Tee - { + Tee { input, output_1, output_2, }, in_1, - in_2 + in_2, ) } } impl BlockWork for Tee { - fn work(&mut self) + fn work(&mut self) -> BlockResult { - let len = self.output_1.vacant_len().min(self.output_2.vacant_len()) + let len = self + .output_1 + .vacant_len() + .min(self.output_2.vacant_len()) .min(self.input.available_len()); - + for _ in 0..len { let elem = self.input.try_pop().unwrap(); // Should be available because of len check - - self.output_1.try_push(elem.clone()); - self.output_2.try_push(elem); + + let _ = self.output_1.try_push(elem.clone()); + let _ = self.output_2.try_push(elem); } + BlockResult::Ok } - fn ready(&self) -> bool { - self.input.available_len() > 0 && - self.output_1.vacant_len() > 0 && - self.output_2.vacant_len() > 0 + fn ready(&mut self) -> bool + { + self.input.available_len() > 0 + && self.output_1.vacant_len() > 0 + && self.output_2.vacant_len() > 0 } } diff --git a/ntw_dsp/src/blocks/utilities.rs b/ntw_dsp/src/blocks/utilities.rs new file mode 100644 index 0000000..1862cf6 --- /dev/null +++ b/ntw_dsp/src/blocks/utilities.rs @@ -0,0 +1,441 @@ +use std::collections::VecDeque; +use std::ops::Div; +use std::sync::mpsc::Receiver; +use std::sync::mpsc::SendError; +use std::sync::mpsc::Sender; +use std::sync::mpsc::TryRecvError; + +use ntw_flowgraph::BlockResult; +use ntw_flowgraph::BlockWork; +use ntw_flowgraph::inout::In; +use ntw_flowgraph::inout::Out; +use ntw_flowgraph::inout::Stream; +use ntw_flowgraph_macros::Block; +use num::Complex; +use num::Float; +use num::One; +use num::complex::ComplexFloat; + +use crate::filtering::fir::Fir; +use crate::filtering::impulse_response::ImpulseResponse; + +#[derive(Block)] +pub struct NullSink +{ + #[input] + input: In, +} + +impl NullSink +{ + pub fn new(input: In) -> Self + { + Self { input } + } +} + +impl BlockWork for NullSink +{ + fn work(&mut self) -> BlockResult + { + self.input.pop_iter().for_each(|_| {}); + BlockResult::Ok + } + + fn ready(&mut self) -> bool + { + self.input.available_len() > 0 + } +} + +#[derive(Block)] +pub struct Repeat +{ + repetition: usize, + current: usize, + holding: Option, + + #[input] + input: In, + + #[output] + output: Out, +} + +impl Repeat +{ + pub fn new(input: In, repetition: usize) -> (Self, In) + { + let (output, stream) = Stream::make(1024); + ( + Self { + repetition, + current: 0, + holding: None, + input, + output, + }, + stream, + ) + } +} + +impl BlockWork for Repeat +{ + fn work(&mut self) -> BlockResult + { + if self.current == 0 + { + self.holding = Some(self.input.try_pop().unwrap()); + self.current = self.repetition; + } + + let pushed = self.output.push_iter(std::iter::repeat_n( + self.holding.clone().unwrap(), + self.current, + )); + + self.current -= pushed; + + BlockResult::Ok + } + + fn ready(&mut self) -> bool + { + self.output.vacant_len() > 0 && (self.current != 0 || self.input.available_len() > 0) + } +} + +#[derive(Block)] +pub struct ChannelSink +{ + #[input] + input: In, + + output: Sender, +} + +impl ChannelSink +{ + pub fn new(input: In) -> (Self, Receiver) + { + let (tx, rx) = std::sync::mpsc::channel(); + (Self { input, output: tx }, rx) + } +} + +impl BlockWork for ChannelSink +{ + fn work(&mut self) -> BlockResult + { + if self + .input + .pop_iter() + .map(|x| match self.output.send(x) + { + Ok(_) => BlockResult::Ok, + Err(SendError(_)) => BlockResult::Finished, + }) + .any(|r| r == BlockResult::Finished) + { + BlockResult::Finished + } + else + { + BlockResult::Ok + } + } + + fn ready(&mut self) -> bool + { + self.input.available_len() > 0 + } +} + +#[derive(Block)] +pub struct ChannelSource +{ + #[output] + output: Out, + + input: Option>, +} + +impl ChannelSource +{ + pub fn new(input: Receiver) -> (Self, In) + { + let (tx, rx) = Stream::make(1024); + ( + Self { + input: Some(input), + output: tx, + }, + rx, + ) + } +} + +impl BlockWork for ChannelSource +{ + fn work(&mut self) -> BlockResult + { + if let Some(input) = &self.input + { + let len = self.output.vacant_len(); + for _ in 0..len + { + match input.try_recv() + { + Ok(x) => + { + let _ = self.output.try_push(x); + } + Err(TryRecvError::Empty) => return BlockResult::Ok, + Err(TryRecvError::Disconnected) => + { + println!("FINISHED"); + self.input = None; + return BlockResult::Finished; + } + } + } + BlockResult::Ok + } + else + { + BlockResult::Finished + } + } + + fn ready(&mut self) -> bool + { + self.input.is_some() && self.output.vacant_len() > 0 + } +} + +#[derive(Block)] +pub struct Chunks +{ + #[input] + input: In, + + #[output] + output: Out<[T; N]>, +} + +impl Chunks +{ + pub fn new(input: In) -> (Self, In<[T; N]>) + { + let (output, chunks) = Stream::make(1024); + (Self { input, output }, chunks) + } +} + +impl BlockWork for Chunks +{ + fn work(&mut self) -> BlockResult + { + let len = (self.input.available_len() / N).min(self.output.vacant_len()); + + let mut acc = vec![]; + for _ in 0..len + { + for _ in 0..N + { + acc.push(self.input.try_pop().unwrap()); + } + let _ = self.output.try_push(*acc.as_array().unwrap()); + } + + BlockResult::Ok + } + + fn ready(&mut self) -> bool + { + self.input.available_len() > N && self.output.vacant_len() > 0 + } +} + +#[derive(Block)] +pub struct Windows +{ + #[input] + input: In, + + #[output] + output: Out<[T; N]>, + + buffer: VecDeque, +} + +impl Windows +{ + pub fn new(input: In) -> (Self, In<[T; N]>) + { + let (output, chunks) = Stream::make(1024); + ( + Self { + input, + output, + buffer: VecDeque::with_capacity(N), + }, + chunks, + ) + } +} + +impl BlockWork for Windows +{ + fn work(&mut self) -> BlockResult + { + let len = (self.input.available_len()).min(self.output.vacant_len()); + + for _ in 0..len + { + let x = self.input.try_pop().unwrap(); + if self.buffer.len() == N + { + let (a, b) = self.buffer.as_slices(); + let _ = self.output.try_push( + *a.iter() + .chain(b.iter()) + .cloned() + .collect::>() + .as_array() + .unwrap(), + ); + self.buffer.pop_front(); + } + self.buffer.push_back(x); + } + + BlockResult::Ok + } + + fn ready(&mut self) -> bool + { + self.input.available_len() > 0 && self.output.vacant_len() > 0 + } +} + +#[derive(Block)] +pub struct SimpleAgc +where + T::Real: Float, +{ + #[input] + input: In, + + #[output] + output: Out, + + level_fir: Fir, +} + +impl SimpleAgc +where + T::Real: Float, +{ + pub fn new(input: In, filter_length: usize) -> (Self, In) + { + let (output, agc) = Stream::make(1024); + ( + Self { + input, + output, + level_fir: Fir::new( + ImpulseResponse(vec![T::Real::one(); filter_length]).normalized(), + ), + }, + agc, + ) + } +} + +impl BlockWork for SimpleAgc +where + T::Real: Float, + T: Div, +{ + fn work(&mut self) -> BlockResult + { + self.output.push_iter(self.input.pop_iter().map(|x| { + let norm = num::traits::real::Real::sqrt(x.re() * x.re() + x.im() * x.im()); + let level = self.level_fir.next(norm); + x / level + })); + BlockResult::Ok + } + + fn ready(&mut self) -> bool + { + self.input.available_len() > 0 && self.output.vacant_len() > 0 + } +} + +#[derive(Block)] +pub struct SimpleSquelch +{ + #[input] + input: In>, + + #[output] + output: Out>, + + level_fir: Fir, + minimum_level: T, + open: bool, +} + +impl SimpleSquelch +{ + pub fn new( + input: In>, + filter_length: usize, + minimum_level: T, + ) -> (Self, In>) + { + let (output, agc) = Stream::make(1024); + ( + Self { + input, + output, + minimum_level, + level_fir: Fir::new(ImpulseResponse(vec![T::one(); filter_length]).normalized()), + open: false, + }, + agc, + ) + } +} + +impl BlockWork for SimpleSquelch +{ + fn work(&mut self) -> BlockResult + { + for _ in 0..(self.input.available_len()) + { + let x = self.input.try_pop().unwrap(); + let level = self.level_fir.next(x.norm()); + self.open = level >= self.minimum_level; + + if self.open && self.output.vacant_len() == 0 + { + return BlockResult::Ok; + } + else if self.open + { + let _ = self.output.try_push(x); + } + } + + BlockResult::Ok + } + + fn ready(&mut self) -> bool + { + self.input.available_len() > 0 && (!self.open || self.output.vacant_len() > 0) + } +} diff --git a/ntw_dsp/src/filtering.rs b/ntw_dsp/src/filtering.rs new file mode 100644 index 0000000..25d91da --- /dev/null +++ b/ntw_dsp/src/filtering.rs @@ -0,0 +1,2 @@ +pub mod fir; +pub mod impulse_response; diff --git a/ntw_dsp/src/filtering/fir.rs b/ntw_dsp/src/filtering/fir.rs new file mode 100644 index 0000000..2a93206 --- /dev/null +++ b/ntw_dsp/src/filtering/fir.rs @@ -0,0 +1,67 @@ +use std::collections::VecDeque; +use std::ops::Add; +use std::ops::Mul; + +use ringbuf::traits::Consumer; + +use crate::filtering::impulse_response::ImpulseResponse; + +pub struct Fir +where + V: Mul, + U: Add, +{ + // Elements at index 0 represent the earliest elements + taps: ImpulseResponse, + queue: VecDeque, + length: usize, +} + +impl Fir +where + C: Clone, + V: Clone, + V: Mul, + U: Add, +{ + pub fn new(taps: ImpulseResponse) -> Self + { + let len = taps.len(); + assert!(len > 0); + Self { + taps, + queue: VecDeque::with_capacity(len), + length: len, + } + } + + pub fn next(&mut self, x: V) -> U + { + if self.queue.len() >= self.length + { + let _ = self.queue.pop_front(); + } + + self.queue.push_back(x); + + // Convolve + self.taps + .0 + .iter() + .zip(self.queue.iter()) + .map(|(tap, sample)| sample.clone() * tap.clone()) + .reduce(Add::add) + .unwrap() // Will not panic, and queue are not empty + } + + pub fn clear(&mut self) + { + self.queue.clear(); + } +} + +// Completely stolen from sdrpp dsp code +pub fn estimate_fir_length(transition_width: f32, sample_rate: f32) -> f32 +{ + 3.8 * sample_rate / transition_width +} diff --git a/ntw_dsp/src/filtering/impulse_response.rs b/ntw_dsp/src/filtering/impulse_response.rs new file mode 100644 index 0000000..f29597b --- /dev/null +++ b/ntw_dsp/src/filtering/impulse_response.rs @@ -0,0 +1,154 @@ +use std::ops::Add; +use std::ops::Div; +use std::ops::Mul; + +use num::Complex; +use rustfft::FftNum; +use rustfft::FftPlanner; + +use crate::filtering::impulse_response::window::Window; +use crate::generation::Nco; +use crate::generation::NcoType; + +#[derive(Clone)] +pub struct ImpulseResponse(pub Vec); + +impl ImpulseResponse +{ + pub fn len(&self) -> usize + { + self.0.len() + } + + pub fn is_empty(&self) -> bool + { + self.len() == 0 + } +} + +impl ImpulseResponse> +where + T: NcoType, +{ + pub fn from_nco(nco: &mut Nco, length: usize) -> Self + { + ImpulseResponse(nco.take(length).collect::>>()) + } +} + +impl ImpulseResponse> +where + T: FftNum, +{ + pub fn from_transfer_function(tranfer_function: &[Complex]) -> Self + { + let mut planner = FftPlanner::new(); + let ifft = planner.plan_fft_inverse(tranfer_function.len()); + let mut tf = tranfer_function.to_vec(); + ifft.process(tf.as_mut_slice()); + + let mut ir = vec![]; + for i in 0..tranfer_function.len() + { + let k = (tranfer_function.len() - (tranfer_function.len() / 2) + i) + % tranfer_function.len(); + ir.push(tf[k]); + } + + Self(ir) + } +} + +impl ImpulseResponse +where + T: Add + Div + Clone, +{ + pub fn normalize(&mut self) + { + let sum = self + .0 + .iter() + .cloned() + .reduce(|a, b| T::add(a.clone(), b.clone())); + if sum.is_none() + { + return; + } + + let sum = sum.unwrap().clone(); + self.0.iter_mut().for_each(|x| *x = x.clone() / sum.clone()); + } + + pub fn normalized(&self) -> ImpulseResponse + { + let mut new = self.clone(); + new.normalize(); + new + } +} + +impl From for ImpulseResponse +where + U: AsRef<[T]>, + T: Clone, +{ + fn from(value: U) -> Self + { + ImpulseResponse(Vec::from(value.as_ref())) + } +} + +impl ImpulseResponse +where + T: Mul + Clone, +{ + pub fn windowed(&self, w: Window) -> Self + { + let mut new = self.clone(); + let len = new.len(); + new.0 + .iter_mut() + .enumerate() + .for_each(|(i, x)| *x = x.clone() * w(i as f32 / len as f32)); + new + } +} + +pub mod window +{ + use std::f32::consts::PI; + + pub type Window = fn(f32) -> f32; + + pub fn rectangular(_: f32) -> f32 + { + 1. + } + + pub fn bartlett(t: f32) -> f32 + { + if t < 0.5 { 2. * t } else { 2. - 2. * t } + } + + pub fn hann(t: f32) -> f32 + { + 0.5 - 0.5 * (2. * PI * t).cos() + } + + pub fn hamming(t: f32) -> f32 + { + 0.54 - 0.46 * (2. * PI * t).cos() + } + + pub fn blackmann(t: f32) -> f32 + { + let x = 2. * PI * t; + 0.45 - 0.5 * x.cos() + 0.08 * (2. * x).cos() + } + + pub fn gaussian(sigma: f32, t: f32) -> f32 + { + let sq = (t - 0.5) / sigma; + (-sq * sq).exp() + } +} diff --git a/ntw_dsp/src/generation.rs b/ntw_dsp/src/generation.rs index 858678e..8f5165e 100644 --- a/ntw_dsp/src/generation.rs +++ b/ntw_dsp/src/generation.rs @@ -1,9 +1,32 @@ -use std::{f64::consts::PI, marker::PhantomData}; +use std::f64::consts::PI; +use std::marker::PhantomData; use num::Complex; use crate::Frequency; +pub trait NcoType: Sized +{ + fn angle(t: f64) -> Complex; +} + +impl NcoType for f32 +{ + fn angle(t: f64) -> Complex + { + Complex::new(t.cos() as f32, t.sin() as f32) + } +} + +impl NcoType for f64 +{ + fn angle(t: f64) -> Complex + { + Complex::new(t.cos(), t.sin()) + } +} + +#[derive(Clone, Copy)] pub struct Nco { // Phase offset : 0 = 0, usize::MAX = 2*pi @@ -44,63 +67,34 @@ impl Nco } } -impl Nco +impl Nco +where + T: NcoType, { - pub fn sample_sin(&self) -> f32 + pub fn sample_sin(&self) -> T { - let t = (self.phase as f32 / usize::MAX as f32) * 2. * std::f32::consts::PI; - t.sin() + let t = (self.phase as f64 / usize::MAX as f64) * 2. * std::f64::consts::PI; + T::angle(t).im } - pub fn sample_cos(&self) -> f32 + pub fn sample_cos(&self) -> T { - let t = (self.phase as f32 / usize::MAX as f32) * 2. * std::f32::consts::PI; - t.cos() + let t = (self.phase as f64 / usize::MAX as f64) * 2. * std::f64::consts::PI; + T::angle(t).re } - pub fn sample(&self) -> Complex + pub fn sample(&self) -> Complex { - let t = (self.phase as f32 / usize::MAX as f32) * 2. * std::f32::consts::PI; - Complex::new(t.cos(), t.sin()) + let t = (self.phase as f64 / usize::MAX as f64) * 2. * std::f64::consts::PI; + T::angle(t) } } -impl Nco +impl Iterator for Nco +where + T: NcoType, { - pub fn sample_sin(&self) -> f64 - { - let t = (self.phase as f64 / usize::MAX as f64) * 2. * std::f64::consts::PI; - t.sin() - } - - pub fn sample_cos(&self) -> f64 - { - let t = (self.phase as f64 / usize::MAX as f64) * 2. * std::f64::consts::PI; - t.cos() - } - - pub fn sample(&self) -> Complex - { - let t = (self.phase as f64 / usize::MAX as f64) * 2. * std::f64::consts::PI; - Complex::new(t.cos(), t.sin()) - } -} - -impl Iterator for Nco -{ - type Item = Complex; - - fn next(&mut self) -> Option - { - let v = self.sample(); - self.step(); - Some(v) - } -} - -impl Iterator for Nco -{ - type Item = Complex; + type Item = Complex; fn next(&mut self) -> Option { diff --git a/ntw_dsp/src/lib.rs b/ntw_dsp/src/lib.rs index c117b15..61cc962 100644 --- a/ntw_dsp/src/lib.rs +++ b/ntw_dsp/src/lib.rs @@ -1,6 +1,8 @@ use std::f64::consts::PI; +use std::ops::Neg; pub mod blocks; +pub mod filtering; pub mod generation; #[derive(Clone, Copy, PartialEq, Debug)] @@ -35,3 +37,13 @@ fn euclid_mod(a: f64, m: f64) -> f64 let r = a % m; if r < 0.0 { r + m } else { r } } + +impl Neg for Frequency +{ + type Output = Frequency; + + fn neg(self) -> Self::Output + { + Frequency(usize::MAX - self.0) + } +} diff --git a/ntw_flowgraph/src/graph.rs b/ntw_flowgraph/src/graph.rs index 28b2958..16268e5 100644 --- a/ntw_flowgraph/src/graph.rs +++ b/ntw_flowgraph/src/graph.rs @@ -1,9 +1,25 @@ -use crate::{Block, BlockWork, RunnableBlock}; +use std::thread::JoinHandle; + +use crate::Block; +use crate::BlockWork; +use crate::RunnableBlock; +use petgraph::dot::Dot; use petgraph::graph::DiGraph; +#[macro_export] +macro_rules! graph { + ($( $b:ident ),* $(,)?) => {{ + let mut g = Graph::new(); + $( + g.add_block($b); + )* + g + }}; +} + pub struct Graph { - blocks: Vec>, + blocks: Vec>, } impl Graph @@ -13,13 +29,13 @@ impl Graph Graph { blocks: vec![] } } - pub fn add_block(&mut self, block: impl Block + BlockWork + 'static) + pub fn add_block(&mut self, block: impl Block + BlockWork + Send + 'static) { block.set_block_index(self.blocks.len()); self.blocks.push(Box::new(block)); } - pub fn run(&mut self) + pub fn run(mut self) -> JoinHandle<()> { // Compute the topo_order let mut digraph = DiGraph::<(), (), usize>::with_capacity(self.blocks.len(), 1); @@ -43,24 +59,26 @@ impl Graph .collect::>(); // Dumbass round robin - loop - { - let mut one_ready = false; - for x in topo_order.iter() + std::thread::spawn(move || { + loop { - let block = &mut self.blocks[*x]; - if block.ready() + let mut one_ready = false; + for x in topo_order.iter() { - block.work(); - one_ready = true; + let block = &mut self.blocks[*x]; + if block.ready() + { + block.work(); + one_ready = true; + } + } + + if !one_ready + { + break; } } - - if !one_ready - { - break; - } - } + }) } pub fn print_deps(&self) @@ -75,6 +93,25 @@ impl Graph println!(); } } + + pub fn get_dot(&self) -> String + { + let mut digraph = DiGraph::::with_capacity(self.blocks.len(), 1); + let len = self.blocks.len(); + (0..len).for_each(|i| { + digraph.add_node(self.blocks[i].get_block_name().to_owned()); + }); + + for (i, block) in self.blocks.iter().enumerate() + { + for next in block.get_successors() + { + digraph.add_edge(i.into(), next.into(), ()); + } + } + + format!("{:?}", Dot::with_config(&digraph, &[])) + } } impl Default for Graph diff --git a/ntw_flowgraph/src/inout.rs b/ntw_flowgraph/src/inout.rs index b951db4..1779758 100644 --- a/ntw_flowgraph/src/inout.rs +++ b/ntw_flowgraph/src/inout.rs @@ -7,21 +7,20 @@ use ringbuf::traits::Observer; use ringbuf::traits::Producer; use ringbuf::traits::Split; use ringbuf::wrap::caching::Caching; -use std::cell::Cell; -use std::rc::Rc; use std::sync::Arc; +use std::sync::Mutex; // Represent a block input, of which data is popped pub struct In { - block: Rc>>, + block: Arc>>, pub rb: Caching>>, false, true>, } // Represent a block output, in which data is pushed pub struct Out { - to: Rc>>, + to: Arc>>, pub rb: Caching>>, true, false>, } @@ -32,7 +31,7 @@ impl Stream pub fn make(length: usize) -> (Out, In) { let (prod, cons) = HeapRb::::new(length).split(); - let to = Rc::new(Cell::new(None)); + let to = Arc::new(Mutex::new(None)); ( Out { to: to.clone(), @@ -50,7 +49,8 @@ impl In { pub fn set_index(&self, index: usize) { - self.block.set(Some(index)) + let mut guard = self.block.lock().unwrap(); + *guard = Some(index); } pub fn try_pop(&mut self) -> Option @@ -73,7 +73,7 @@ impl Out { pub fn get_successor(&self) -> Option { - self.to.get() + *self.to.lock().unwrap() } pub fn try_push(&mut self, data: T) -> Result<(), T> diff --git a/ntw_flowgraph/src/lib.rs b/ntw_flowgraph/src/lib.rs index 68da34d..4c62560 100644 --- a/ntw_flowgraph/src/lib.rs +++ b/ntw_flowgraph/src/lib.rs @@ -1,9 +1,16 @@ pub mod graph; pub mod inout; +#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] +pub enum BlockResult +{ + Ok, + Finished, +} + pub trait BlockWork { - fn work(&mut self); + fn work(&mut self) -> BlockResult; fn ready(&mut self) -> bool; } @@ -11,6 +18,9 @@ pub trait Block { fn set_block_index(&self, index: usize); fn get_successors(&self) -> Vec; + + // Meta functions + fn get_block_name(&self) -> &'static str; } pub trait RunnableBlock: Block + BlockWork {} diff --git a/ntw_flowgraph_macros/src/lib.rs b/ntw_flowgraph_macros/src/lib.rs index 9cbb60f..558c902 100644 --- a/ntw_flowgraph_macros/src/lib.rs +++ b/ntw_flowgraph_macros/src/lib.rs @@ -6,10 +6,22 @@ use syn::parse_macro_input; struct BlockDerive { + block_name: String, input_fields: Vec, output_fields: Vec, } +fn get_block_name_func(ctx: &BlockDerive) -> proc_macro2::TokenStream +{ + let block_name = ctx.block_name.as_str(); + quote! { + fn get_block_name(&self) -> &'static str + { + #block_name + } + } +} + fn set_block_index_func(ctx: &BlockDerive) -> proc_macro2::TokenStream { let inputs = ctx.input_fields.clone(); @@ -106,23 +118,27 @@ pub fn block_derive(item: TokenStream) -> TokenStream .collect::>(); let derive = BlockDerive { + block_name: input.ident.to_string(), input_fields, output_fields, }; let set_index_func = set_block_index_func(&derive); let get_successors_func = get_successors_func(&derive); + let get_block_name_func = get_block_name_func(&derive); let struct_path = input.ident; - let struct_where = input.generics.where_clause.clone(); - let struct_generics = input.generics; + let (impl_generics, type_generics, where_clause) = input.generics.split_for_impl(); //item quote! { - impl #struct_generics ntw_flowgraph::Block for #struct_path #struct_generics - #struct_where + impl #impl_generics ntw_flowgraph::Block for #struct_path #type_generics + #where_clause { #set_index_func #get_successors_func + + // Meta information + #get_block_name_func } } .into() diff --git a/out.csv b/out.csv new file mode 100644 index 0000000..ce0a62a --- /dev/null +++ b/out.csv @@ -0,0 +1,2040 @@ +1, +0.98078525, +0.9238795, +0.8314696, +0.70710677, +0.5555702, +0.38268343, +0.19509023, +-0.00000004371139, +-0.19509032, +-0.38268352, +-0.55557036, +-0.70710677, +-0.83146966, +-0.9238796, +-0.9807853, +-1, +-0.98078525, +-0.9238795, +-0.83146954, +-0.70710665, +-0.55557, +-0.38268313, +-0.19509038, +0.000000011924881, +0.19509041, +0.3826836, +0.5555704, +0.707107, +0.8314696, +0.92387956, +0.9807853, +1, +0.98078525, +0.9238795, +0.8314696, +0.70710677, +0.5555702, +0.38268343, +0.19509023, +-0.00000004371139, +-0.19509032, +-0.38268352, +-0.55557036, +-0.70710677, +-0.83146966, +-0.9238796, +-0.9807853, +-1, +-0.98078525, +-0.9238795, +-0.83146954, +-0.70710665, +-0.55557, +-0.38268313, +-0.19509038, +0.000000011924881, +0.19509041, +0.3826836, +0.5555704, +0.707107, +0.8314696, +0.92387956, +0.9807853, +1, +0.98078525, +0.9238795, +0.8314696, +0.70710677, +0.5555702, +0.38268343, +0.19509023, +-0.00000004371139, +-0.19509032, +-0.38268352, +-0.55557036, +-0.70710677, +-0.83146966, +-0.9238796, +-0.9807853, +-1, +-0.98078525, +-0.9238795, +-0.83146954, +-0.70710665, +-0.55557, +-0.38268313, +-0.19509038, +0.000000011924881, +0.19509041, +0.3826836, +0.5555704, +0.707107, +0.8314696, +0.92387956, +0.9807853, +1, +0.98078525, +0.9238795, +0.8314696, +0.70710677, +0.5555702, +0.38268343, +0.19509023, +-0.00000004371139, +-0.19509032, +-0.38268352, +-0.55557036, +-0.70710677, +-0.83146966, +-0.9238796, +-0.9807853, +-1, +-0.98078525, +-0.9238795, +-0.83146954, +-0.70710665, +-0.55557, +-0.38268313, +-0.19509038, +0.000000011924881, +0.19509041, +0.3826836, +0.5555704, +0.707107, +0.8314696, +0.92387956, +0.9807853, +1, +0.98078525, +0.9238795, +0.8314696, +0.70710677, +0.5555702, +0.38268343, +0.19509023, +-0.00000004371139, +-0.19509032, +-0.38268352, +-0.55557036, +-0.70710677, +-0.83146966, +-0.9238796, +-0.9807853, +-1, +-0.98078525, +-0.9238795, +-0.83146954, +-0.70710665, +-0.55557, +-0.38268313, +-0.19509038, +0.000000011924881, +0.19509041, +0.3826836, +0.5555704, +0.707107, +0.8314696, +0.92387956, +0.9807853, +1, +0.98078525, +0.9238795, +0.8314696, +0.70710677, +0.5555702, +0.38268343, +0.19509023, +-0.00000004371139, +-0.19509032, +-0.38268352, +-0.55557036, +-0.70710677, +-0.83146966, +-0.9238796, +-0.9807853, +-1, +-0.98078525, +-0.9238795, +-0.83146954, +-0.70710665, +-0.55557, +-0.38268313, +-0.19509038, +0.000000011924881, +0.19509041, +0.3826836, +0.5555704, +0.707107, +0.8314696, +0.92387956, +0.9807853, +1, +0.98078525, +0.9238795, +0.8314696, +0.70710677, +0.5555702, +0.38268343, +0.19509023, +-0.00000004371139, +-0.19509032, +-0.38268352, +-0.55557036, +-0.70710677, +-0.83146966, +-0.9238796, +-0.9807853, +-1, +-0.98078525, +-0.9238795, +-0.83146954, +-0.70710665, +-0.55557, +-0.38268313, +-0.19509038, +0.000000011924881, +0.19509041, +0.3826836, +0.5555704, +0.707107, +0.8314696, +0.92387956, +0.9807853, +1, +0.98078525, +0.9238795, +0.8314696, +0.70710677, +0.5555702, +0.38268343, +0.19509023, +-0.00000004371139, +-0.19509032, +-0.38268352, +-0.55557036, +-0.70710677, +-0.83146966, +-0.9238796, +-0.9807853, +-1, +-0.98078525, +-0.9238795, +-0.83146954, +-0.70710665, +-0.55557, +-0.38268313, +-0.19509038, +0.000000011924881, +0.19509041, +0.3826836, +0.5555704, +0.707107, +0.8314696, +0.92387956, +0.9807853, +1, +0.98078525, +0.9238795, +0.8314696, +0.70710677, +0.5555702, +0.38268343, +0.19509023, +-0.00000004371139, +-0.19509032, +-0.38268352, +-0.55557036, +-0.70710677, +-0.83146966, +-0.9238796, +-0.9807853, +-1, +-0.98078525, +-0.9238795, +-0.83146954, +-0.70710665, +-0.55557, +-0.38268313, +-0.19509038, +0.000000011924881, +0.19509041, +0.3826836, +0.5555704, +0.707107, +0.8314696, +0.92387956, +0.9807853, +1, +0.98078525, +0.9238795, +0.8314696, +0.70710677, +0.5555702, +0.38268343, +0.19509023, +-0.00000004371139, +-0.19509032, +-0.38268352, +-0.55557036, +-0.70710677, +-0.83146966, +-0.9238796, +-0.9807853, +-1, +-0.98078525, +-0.9238795, +-0.83146954, +-0.70710665, +-0.55557, +-0.38268313, +-0.19509038, +0.000000011924881, +0.19509041, +0.3826836, +0.5555704, +0.707107, +0.8314696, +0.92387956, +0.9807853, +1, +0.98078525, +0.9238795, +0.8314696, +0.70710677, +0.5555702, +0.38268343, +0.19509023, +-0.00000004371139, +-0.19509032, +-0.38268352, +-0.55557036, +-0.70710677, +-0.83146966, +-0.9238796, +-0.9807853, +-1, +-0.98078525, +-0.9238795, +-0.83146954, +-0.70710665, +-0.55557, +-0.38268313, +-0.19509038, +0.000000011924881, +0.19509041, +0.3826836, +0.5555704, +0.707107, +0.8314696, +0.92387956, +0.9807853, +1, +0.98078525, +0.9238795, +0.8314696, +0.70710677, +0.5555702, +0.38268343, +0.19509023, +-0.00000004371139, +-0.19509032, +-0.38268352, +-0.55557036, +-0.70710677, +-0.83146966, +-0.9238796, +-0.9807853, +-1, +-0.98078525, +-0.9238795, +-0.83146954, +-0.70710665, +-0.55557, +-0.38268313, +-0.19509038, +0.000000011924881, +0.19509041, +0.3826836, +0.5555704, +0.707107, +0.8314696, +0.92387956, +0.9807853, +1, +0.98078525, +0.9238795, +0.8314696, +0.70710677, +0.5555702, +0.38268343, +0.19509023, +-0.00000004371139, +-0.19509032, +-0.38268352, +-0.55557036, +-0.70710677, +-0.83146966, +-0.9238796, +-0.9807853, +-1, +-0.98078525, +-0.9238795, +-0.83146954, +-0.70710665, +-0.55557, +-0.38268313, +-0.19509038, +0.000000011924881, +0.19509041, +0.3826836, +0.5555704, +0.707107, +0.8314696, +0.92387956, +0.9807853, +1, +0.98078525, +0.9238795, +0.8314696, +0.70710677, +0.5555702, +0.38268343, +0.19509023, +-0.00000004371139, +-0.19509032, +-0.38268352, +-0.55557036, +-0.70710677, +-0.83146966, +-0.9238796, +-0.9807853, +-1, +-0.98078525, +-0.9238795, +-0.83146954, +-0.70710665, +-0.55557, +-0.38268313, +-0.19509038, +0.000000011924881, +0.19509041, +0.3826836, +0.5555704, +0.707107, +0.8314696, +0.92387956, +0.9807853, +1, +0.98078525, +0.9238795, +0.8314696, +0.70710677, +0.5555702, +0.38268343, +0.19509023, +-0.00000004371139, +-0.19509032, +-0.38268352, +-0.55557036, +-0.70710677, +-0.83146966, +-0.9238796, +-0.9807853, +-1, +-0.98078525, +-0.9238795, +-0.83146954, +-0.70710665, +-0.55557, +-0.38268313, +-0.19509038, +0.000000011924881, +0.19509041, +0.3826836, +0.5555704, +0.707107, +0.8314696, +0.92387956, +0.9807853, +1, +0.98078525, +0.9238795, +0.8314696, +0.70710677, +0.5555702, +0.38268343, +0.19509023, +-0.00000004371139, +-0.19509032, +-0.38268352, +-0.55557036, +-0.70710677, +-0.83146966, +-0.9238796, +-0.9807853, +-1, +-0.98078525, +-0.9238795, +-0.83146954, +-0.70710665, +-0.55557, +-0.38268313, +-0.19509038, +0.000000011924881, +0.19509041, +0.3826836, +0.5555704, +0.707107, +0.8314696, +0.92387956, +0.9807853, +1, +0.98078525, +0.9238795, +0.8314696, +0.70710677, +0.5555702, +0.38268343, +0.19509023, +-0.00000004371139, +-0.19509032, +-0.38268352, +-0.55557036, +-0.70710677, +-0.83146966, +-0.9238796, +-0.9807853, +-1, +-0.98078525, +-0.9238795, +-0.83146954, +-0.70710665, +-0.55557, +-0.38268313, +-0.19509038, +0.000000011924881, +0.19509041, +0.3826836, +0.5555704, +0.707107, +0.8314696, +0.92387956, +0.9807853, +1, +0.98078525, +0.9238795, +0.8314696, +0.70710677, +0.5555702, +0.38268343, +0.19509023, +-0.00000004371139, +-0.19509032, +-0.38268352, +-0.55557036, +-0.70710677, +-0.83146966, +-0.9238796, +-0.9807853, +-1, +-0.98078525, +-0.9238795, +-0.83146954, +-0.70710665, +-0.55557, +-0.38268313, +-0.19509038, +0.000000011924881, +0.19509041, +0.3826836, +0.5555704, +0.707107, +0.8314696, +0.92387956, +0.9807853, +1, +0.98078525, +0.9238795, +0.8314696, +0.70710677, +0.5555702, +0.38268343, +0.19509023, +-0.00000004371139, +-0.19509032, +-0.38268352, +-0.55557036, +-0.70710677, +-0.83146966, +-0.9238796, +-0.9807853, +-1, +-0.98078525, +-0.9238795, +-0.83146954, +-0.70710665, +-0.55557, +-0.38268313, +-0.19509038, +0.000000011924881, +0.19509041, +0.3826836, +0.5555704, +0.707107, +0.8314696, +0.92387956, +0.9807853, +1, +0.98078525, +0.9238795, +0.8314696, +0.70710677, +0.5555702, +0.38268343, +0.19509023, +-0.00000004371139, +-0.19509032, +-0.38268352, +-0.55557036, +-0.70710677, +-0.83146966, +-0.9238796, +-0.9807853, +-1, +-0.98078525, +-0.9238795, +-0.83146954, +-0.70710665, +-0.55557, +-0.38268313, +-0.19509038, +0.000000011924881, +0.19509041, +0.3826836, +0.5555704, +0.707107, +0.8314696, +0.92387956, +0.9807853, +1, +0.98078525, +0.9238795, +0.8314696, +0.70710677, +0.5555702, +0.38268343, +0.19509023, +-0.00000004371139, +-0.19509032, +-0.38268352, +-0.55557036, +-0.70710677, +-0.83146966, +-0.9238796, +-0.9807853, +-1, +-0.98078525, +-0.9238795, +-0.83146954, +-0.70710665, +-0.55557, +-0.38268313, +-0.19509038, +0.000000011924881, +0.19509041, +0.3826836, +0.5555704, +0.707107, +0.8314696, +0.92387956, +0.9807853, +1, +0.98078525, +0.9238795, +0.8314696, +0.70710677, +0.5555702, +0.38268343, +0.19509023, +-0.00000004371139, +-0.19509032, +-0.38268352, +-0.55557036, +-0.70710677, +-0.83146966, +-0.9238796, +-0.9807853, +-1, +-0.98078525, +-0.9238795, +-0.83146954, +-0.70710665, +-0.55557, +-0.38268313, +-0.19509038, +0.000000011924881, +0.19509041, +0.3826836, +0.5555704, +0.707107, +0.8314696, +0.92387956, +0.9807853, +1, +0.98078525, +0.9238795, +0.8314696, +0.70710677, +0.5555702, +0.38268343, +0.19509023, +-0.00000004371139, +-0.19509032, +-0.38268352, +-0.55557036, +-0.70710677, +-0.83146966, +-0.9238796, +-0.9807853, +-1, +-0.98078525, +-0.9238795, +-0.83146954, +-0.70710665, +-0.55557, +-0.38268313, +-0.19509038, +0.000000011924881, +0.19509041, +0.3826836, +0.5555704, +0.707107, +0.8314696, +0.92387956, +0.9807853, +1, +0.98078525, +0.9238795, +0.8314696, +0.70710677, +0.5555702, +0.38268343, +0.19509023, +-0.00000004371139, +-0.19509032, +-0.38268352, +-0.55557036, +-0.70710677, +-0.83146966, +-0.9238796, +-0.9807853, +-1, +-0.98078525, +-0.9238795, +-0.83146954, +-0.70710665, +-0.55557, +-0.38268313, +-0.19509038, +0.000000011924881, +0.19509041, +0.3826836, +0.5555704, +0.707107, +0.8314696, +0.92387956, +0.9807853, +1, +0.98078525, +0.9238795, +0.8314696, +0.70710677, +0.5555702, +0.38268343, +0.19509023, +-0.00000004371139, +-0.19509032, +-0.38268352, +-0.55557036, +-0.70710677, +-0.83146966, +-0.9238796, +-0.9807853, +-1, +-0.98078525, +-0.9238795, +-0.83146954, +-0.70710665, +-0.55557, +-0.38268313, +-0.19509038, +0.000000011924881, +0.19509041, +0.3826836, +0.5555704, +0.707107, +0.8314696, +0.92387956, +0.9807853, +1, +0.98078525, +0.9238795, +0.8314696, +0.70710677, +0.5555702, +0.38268343, +0.19509023, +-0.00000004371139, +-0.19509032, +-0.38268352, +-0.55557036, +-0.70710677, +-0.83146966, +-0.9238796, +-0.9807853, +-1, +-0.98078525, +-0.9238795, +-0.83146954, +-0.70710665, +-0.55557, +-0.38268313, +-0.19509038, +0.000000011924881, +0.19509041, +0.3826836, +0.5555704, +0.707107, +0.8314696, +0.92387956, +0.9807853, +1, +0.98078525, +0.9238795, +0.8314696, +0.70710677, +0.5555702, +0.38268343, +0.19509023, +-0.00000004371139, +-0.19509032, +-0.38268352, +-0.55557036, +-0.70710677, +-0.83146966, +-0.9238796, +-0.9807853, +-1, +-0.98078525, +-0.9238795, +-0.83146954, +-0.70710665, +-0.55557, +-0.38268313, +-0.19509038, +0.000000011924881, +0.19509041, +0.3826836, +0.5555704, +0.707107, +0.8314696, +0.92387956, +0.9807853, +1, +0.98078525, +0.9238795, +0.8314696, +0.70710677, +0.5555702, +0.38268343, +0.19509023, +-0.00000004371139, +-0.19509032, +-0.38268352, +-0.55557036, +-0.70710677, +-0.83146966, +-0.9238796, +-0.9807853, +-1, +-0.98078525, +-0.9238795, +-0.83146954, +-0.70710665, +-0.55557, +-0.38268313, +-0.19509038, +0.000000011924881, +0.19509041, +0.3826836, +0.5555704, +0.707107, +0.8314696, +0.92387956, +0.9807853, +1, +0.98078525, +0.9238795, +0.8314696, +0.70710677, +0.5555702, +0.38268343, +0.19509023, +-0.00000004371139, +-0.19509032, +-0.38268352, +-0.55557036, +-0.70710677, +-0.83146966, +-0.9238796, +-0.9807853, +-1, +-0.98078525, +-0.9238795, +-0.83146954, +-0.70710665, +-0.55557, +-0.38268313, +-0.19509038, +0.000000011924881, +0.19509041, +0.3826836, +0.5555704, +0.707107, +0.8314696, +0.92387956, +0.9807853, +1, +0.98078525, +0.9238795, +0.8314696, +0.70710677, +0.5555702, +0.38268343, +0.19509023, +-0.00000004371139, +-0.19509032, +-0.38268352, +-0.55557036, +-0.70710677, +-0.83146966, +-0.9238796, +-0.9807853, +-1, +-0.98078525, +-0.9238795, +-0.83146954, +-0.70710665, +-0.55557, +-0.38268313, +-0.19509038, +0.000000011924881, +0.19509041, +0.3826836, +0.5555704, +0.707107, +0.8314696, +0.92387956, +0.9807853, +1, +0.98078525, +0.9238795, +0.8314696, +0.70710677, +0.5555702, +0.38268343, +0.19509023, +-0.00000004371139, +-0.19509032, +-0.38268352, +-0.55557036, +-0.70710677, +-0.83146966, +-0.9238796, +-0.9807853, +-1, +-0.98078525, +-0.9238795, +-0.83146954, +-0.70710665, +-0.55557, +-0.38268313, +-0.19509038, +0.000000011924881, +0.19509041, +0.3826836, +0.5555704, +0.707107, +0.8314696, +0.92387956, +0.9807853, +1, +0.98078525, +0.9238795, +0.8314696, +0.70710677, +0.5555702, +0.38268343, +0.19509023, +-0.00000004371139, +-0.19509032, +-0.38268352, +-0.55557036, +-0.70710677, +-0.83146966, +-0.9238796, +-0.9807853, +-1, +-0.98078525, +-0.9238795, +-0.83146954, +-0.70710665, +-0.55557, +-0.38268313, +-0.19509038, +0.000000011924881, +0.19509041, +0.3826836, +0.5555704, +0.707107, +0.8314696, +0.92387956, +0.9807853, +1, +0.98078525, +0.9238795, +0.8314696, +0.70710677, +0.5555702, +0.38268343, +0.19509023, +-0.00000004371139, +-0.19509032, +-0.38268352, +-0.55557036, +-0.70710677, +-0.83146966, +-0.9238796, +-0.9807853, +-1, +-0.98078525, +-0.9238795, +-0.83146954, +-0.70710665, +-0.55557, +-0.38268313, +-0.19509038, +0.000000011924881, +0.19509041, +0.3826836, +0.5555704, +0.707107, +0.8314696, +0.92387956, +0.9807853, +1, +0.98078525, +0.9238795, +0.8314696, +0.70710677, +0.5555702, +0.38268343, +0.19509023, +-0.00000004371139, +-0.19509032, +-0.38268352, +-0.55557036, +-0.70710677, +-0.83146966, +-0.9238796, +-0.9807853, +-1, +-0.98078525, +-0.9238795, +-0.83146954, +-0.70710665, +-0.55557, +-0.38268313, +-0.19509038, +0.000000011924881, +0.19509041, +0.3826836, +0.5555704, +0.707107, +0.8314696, +0.92387956, +0.9807853, +1, +0.98078525, +0.9238795, +0.8314696, +0.70710677, +0.5555702, +0.38268343, +0.19509023, +-0.00000004371139, +-0.19509032, +-0.38268352, +-0.55557036, +-0.70710677, +-0.83146966, +-0.9238796, +-0.9807853, +-1, +-0.98078525, +-0.9238795, +-0.83146954, +-0.70710665, +-0.55557, +-0.38268313, +-0.19509038, +0.000000011924881, +0.19509041, +0.3826836, +0.5555704, +0.707107, +0.8314696, +0.92387956, +0.9807853, +1, +0.98078525, +0.9238795, +0.8314696, +0.70710677, +0.5555702, +0.38268343, +0.19509023, +-0.00000004371139, +-0.19509032, +-0.38268352, +-0.55557036, +-0.70710677, +-0.83146966, +-0.9238796, +-0.9807853, +-1, +-0.98078525, +-0.9238795, +-0.83146954, +-0.70710665, +-0.55557, +-0.38268313, +-0.19509038, +0.000000011924881, +0.19509041, +0.3826836, +0.5555704, +0.707107, +0.8314696, +0.92387956, +0.9807853, +1, +0.98078525, +0.9238795, +0.8314696, +0.70710677, +0.5555702, +0.38268343, +0.19509023, +-0.00000004371139, +-0.19509032, +-0.38268352, +-0.55557036, +-0.70710677, +-0.83146966, +-0.9238796, +-0.9807853, +-1, +-0.98078525, +-0.9238795, +-0.83146954, +-0.70710665, +-0.55557, +-0.38268313, +-0.19509038, +0.000000011924881, +0.19509041, +0.3826836, +0.5555704, +0.707107, +0.8314696, +0.92387956, +0.9807853, +1, +0.98078525, +0.9238795, +0.8314696, +0.70710677, +0.5555702, +0.38268343, +0.19509023, +-0.00000004371139, +-0.19509032, +-0.38268352, +-0.55557036, +-0.70710677, +-0.83146966, +-0.9238796, +-0.9807853, +-1, +-0.98078525, +-0.9238795, +-0.83146954, +-0.70710665, +-0.55557, +-0.38268313, +-0.19509038, +0.000000011924881, +0.19509041, +0.3826836, +0.5555704, +0.707107, +0.8314696, +0.92387956, +0.9807853, +1, +0.98078525, +0.9238795, +0.8314696, +0.70710677, +0.5555702, +0.38268343, +0.19509023, +-0.00000004371139, +-0.19509032, +-0.38268352, +-0.55557036, +-0.70710677, +-0.83146966, +-0.9238796, +-0.9807853, +-1, +-0.98078525, +-0.9238795, +-0.83146954, +-0.70710665, +-0.55557, +-0.38268313, +-0.19509038, +0.000000011924881, +0.19509041, +0.3826836, +0.5555704, +0.707107, +0.8314696, +0.92387956, +0.9807853, +1, +0.98078525, +0.9238795, +0.8314696, +0.70710677, +0.5555702, +0.38268343, +0.19509023, +-0.00000004371139, +-0.19509032, +-0.38268352, +-0.55557036, +-0.70710677, +-0.83146966, +-0.9238796, +-0.9807853, +-1, +-0.98078525, +-0.9238795, +-0.83146954, +-0.70710665, +-0.55557, +-0.38268313, +-0.19509038, +0.000000011924881, +0.19509041, +0.3826836, +0.5555704, +0.707107, +0.8314696, +0.92387956, +0.9807853, +1, +0.98078525, +0.9238795, +0.8314696, +0.70710677, +0.5555702, +0.38268343, +0.19509023, +-0.00000004371139, +-0.19509032, +-0.38268352, +-0.55557036, +-0.70710677, +-0.83146966, +-0.9238796, +-0.9807853, +-1, +-0.98078525, +-0.9238795, +-0.83146954, +-0.70710665, +-0.55557, +-0.38268313, +-0.19509038, +0.000000011924881, +0.19509041, +0.3826836, +0.5555704, +0.707107, +0.8314696, +0.92387956, +0.9807853, +1, +0.98078525, +0.9238795, +0.8314696, +0.70710677, +0.5555702, +0.38268343, +0.19509023, +-0.00000004371139, +-0.19509032, +-0.38268352, +-0.55557036, +-0.70710677, +-0.83146966, +-0.9238796, +-0.9807853, +-1, +-0.98078525, +-0.9238795, +-0.83146954, +-0.70710665, +-0.55557, +-0.38268313, +-0.19509038, +0.000000011924881, +0.19509041, +0.3826836, +0.5555704, +0.707107, +0.8314696, +0.92387956, +0.9807853, +1, +0.98078525, +0.9238795, +0.8314696, +0.70710677, +0.5555702, +0.38268343, +0.19509023, +-0.00000004371139, +-0.19509032, +-0.38268352, +-0.55557036, +-0.70710677, +-0.83146966, +-0.9238796, +-0.9807853, +-1, +-0.98078525, +-0.9238795, +-0.83146954, +-0.70710665, +-0.55557, +-0.38268313, +-0.19509038, +0.000000011924881, +0.19509041, +0.3826836, +0.5555704, +0.707107, +0.8314696, +0.92387956, +0.9807853, +1, +0.98078525, +0.9238795, +0.8314696, +0.70710677, +0.5555702, +0.38268343, +0.19509023, +-0.00000004371139, +-0.19509032, +-0.38268352, +-0.55557036, +-0.70710677, +-0.83146966, +-0.9238796, +-0.9807853, +-1, +-0.98078525, +-0.9238795, +-0.83146954, +-0.70710665, +-0.55557, +-0.38268313, +-0.19509038, +0.000000011924881, +0.19509041, +0.3826836, +0.5555704, +0.707107, +0.8314696, +0.92387956, +0.9807853, +1, +0.98078525, +0.9238795, +0.8314696, +0.70710677, +0.5555702, +0.38268343, +0.19509023, +-0.00000004371139, +-0.19509032, +-0.38268352, +-0.55557036, +-0.70710677, +-0.83146966, +-0.9238796, +-0.9807853, +-1, +-0.98078525, +-0.9238795, +-0.83146954, +-0.70710665, +-0.55557, +-0.38268313, +-0.19509038, +0.000000011924881, +0.19509041, +0.3826836, +0.5555704, +0.707107, +0.8314696, +0.92387956, +0.9807853, +1, +0.98078525, +0.9238795, +0.8314696, +0.70710677, +0.5555702, +0.38268343, +0.19509023, +-0.00000004371139, +-0.19509032, +-0.38268352, +-0.55557036, +-0.70710677, +-0.83146966, +-0.9238796, +-0.9807853, +-1, +-0.98078525, +-0.9238795, +-0.83146954, +-0.70710665, +-0.55557, +-0.38268313, +-0.19509038, +0.000000011924881, +0.19509041, +0.3826836, +0.5555704, +0.707107, +0.8314696, +0.92387956, +0.9807853, +1, +0.98078525, +0.9238795, +0.8314696, +0.70710677, +0.5555702, +0.38268343, +0.19509023, +-0.00000004371139, +-0.19509032, +-0.38268352, +-0.55557036, +-0.70710677, +-0.83146966, +-0.9238796, +-0.9807853, +-1, +-0.98078525, +-0.9238795, +-0.83146954, +-0.70710665, +-0.55557, +-0.38268313, +-0.19509038, +0.000000011924881, +0.19509041, +0.3826836, +0.5555704, +0.707107, +0.8314696, +0.92387956, +0.9807853, +1, +0.98078525, +0.9238795, +0.8314696, +0.70710677, +0.5555702, +0.38268343, +0.19509023, +-0.00000004371139, +-0.19509032, +-0.38268352, +-0.55557036, +-0.70710677, +-0.83146966, +-0.9238796, +-0.9807853, +-1, +-0.98078525, +-0.9238795, +-0.83146954, +-0.70710665, +-0.55557, +-0.38268313, +-0.19509038, +0.000000011924881, +0.19509041, +0.3826836, +0.5555704, +0.707107, +0.8314696, +0.92387956, +0.9807853, +1, +0.98078525, +0.9238795, +0.8314696, +0.70710677, +0.5555702, +0.38268343, +0.19509023, +-0.00000004371139, +-0.19509032, +-0.38268352, +-0.55557036, +-0.70710677, +-0.83146966, +-0.9238796, +-0.9807853, +-1, +-0.98078525, +-0.9238795, +-0.83146954, +-0.70710665, +-0.55557, +-0.38268313, +-0.19509038, +0.000000011924881, +0.19509041, +0.3826836, +0.5555704, +0.707107, +0.8314696, +0.92387956, +0.9807853, +1, +0.98078525, +0.9238795, +0.8314696, +0.70710677, +0.5555702, +0.38268343, +0.19509023, +-0.00000004371139, +-0.19509032, +-0.38268352, +-0.55557036, +-0.70710677, +-0.83146966, +-0.9238796, +-0.9807853, +-1, +-0.98078525, +-0.9238795, +-0.83146954, +-0.70710665, +-0.55557, +-0.38268313, +-0.19509038, +0.000000011924881, +0.19509041, +0.3826836, +0.5555704, +0.707107, +0.8314696, +0.92387956, +0.9807853, +1, +0.98078525, +0.9238795, +0.8314696, +0.70710677, +0.5555702, +0.38268343, +0.19509023, +-0.00000004371139, +-0.19509032, +-0.38268352, +-0.55557036, +-0.70710677, +-0.83146966, +-0.9238796, +-0.9807853, +-1, +-0.98078525, +-0.9238795, +-0.83146954, +-0.70710665, +-0.55557, +-0.38268313, +-0.19509038, +0.000000011924881, +0.19509041, +0.3826836, +0.5555704, +0.707107, +0.8314696, +0.92387956, +0.9807853, +1, +0.98078525, +0.9238795, +0.8314696, +0.70710677, +0.5555702, +0.38268343, +0.19509023, +-0.00000004371139, +-0.19509032, +-0.38268352, +-0.55557036, +-0.70710677, +-0.83146966, +-0.9238796, +-0.9807853, +-1, +-0.98078525, +-0.9238795, +-0.83146954, +-0.70710665, +-0.55557, +-0.38268313, +-0.19509038, +0.000000011924881, +0.19509041, +0.3826836, +0.5555704, +0.707107, +0.8314696, +0.92387956, +0.9807853, +1, +0.98078525, +0.9238795, +0.8314696, +0.70710677, +0.5555702, +0.38268343, +0.19509023, +-0.00000004371139, +-0.19509032, +-0.38268352, +-0.55557036, +-0.70710677, +-0.83146966, +-0.9238796, +-0.9807853, +-1, +-0.98078525, +-0.9238795, +-0.83146954, +-0.70710665, +-0.55557, +-0.38268313, +-0.19509038, +0.000000011924881, +0.19509041, +0.3826836, +0.5555704, +0.707107, +0.8314696, +0.92387956, +0.9807853, +1, +0.98078525, +0.9238795, +0.8314696, +0.70710677, +0.5555702, +0.38268343, +0.19509023, +-0.00000004371139, +-0.19509032, +-0.38268352, +-0.55557036, +-0.70710677, +-0.83146966, +-0.9238796, +-0.9807853, +-1, +-0.98078525, +-0.9238795, +-0.83146954, +-0.70710665, +-0.55557, +-0.38268313, +-0.19509038, +0.000000011924881, +0.19509041, +0.3826836, +0.5555704, +0.707107, +0.8314696, +0.92387956, +0.9807853, +1, +0.98078525, +0.9238795, +0.8314696, +0.70710677, +0.5555702, +0.38268343, +0.19509023, +-0.00000004371139, +-0.19509032, +-0.38268352, +-0.55557036, +-0.70710677, +-0.83146966, +-0.9238796, +-0.9807853, +-1, +-0.98078525, +-0.9238795, +-0.83146954, +-0.70710665, +-0.55557, +-0.38268313, +-0.19509038, +0.000000011924881, +0.19509041, +0.3826836, +0.5555704, +0.707107, +0.8314696, +0.92387956, +0.9807853, +1, +0.98078525, +0.9238795, +0.8314696, +0.70710677, +0.5555702, +0.38268343, +0.19509023, +-0.00000004371139, +-0.19509032, +-0.38268352, +-0.55557036, +-0.70710677, +-0.83146966, +-0.9238796, +-0.9807853, +-1, +-0.98078525, +-0.9238795, +-0.83146954, +-0.70710665, +-0.55557, +-0.38268313, +-0.19509038, +0.000000011924881, +0.19509041, +0.3826836, +0.5555704, +0.707107, +0.8314696, +0.92387956, +0.9807853, +1, +0.98078525, +0.9238795, +0.8314696, +0.70710677, +0.5555702, +0.38268343, +0.19509023, +-0.00000004371139, +-0.19509032, +-0.38268352, +-0.55557036, +-0.70710677, +-0.83146966, +-0.9238796, +-0.9807853, +-1, +-0.98078525, +-0.9238795, +-0.83146954, +-0.70710665, +-0.55557, +-0.38268313, +-0.19509038, +0.000000011924881, +0.19509041, +0.3826836, +0.5555704, +0.707107, +0.8314696, +0.92387956, +0.9807853, +1, +0.98078525, +0.9238795, +0.8314696, +0.70710677, +0.5555702, +0.38268343, +0.19509023, +-0.00000004371139, +-0.19509032, +-0.38268352, +-0.55557036, +-0.70710677, +-0.83146966, +-0.9238796, +-0.9807853, +-1, +-0.98078525, +-0.9238795, +-0.83146954, +-0.70710665, +-0.55557, +-0.38268313, +-0.19509038, +0.000000011924881, +0.19509041, +0.3826836, +0.5555704, +0.707107, +0.8314696, +0.92387956, +0.9807853, +1, +0.98078525, +0.9238795, +0.8314696, +0.70710677, +0.5555702, +0.38268343, +0.19509023, +-0.00000004371139, +-0.19509032, +-0.38268352, +-0.55557036, +-0.70710677, +-0.83146966, +-0.9238796, +-0.9807853, +-1, +-0.98078525, +-0.9238795, +-0.83146954, +-0.70710665, +-0.55557, +-0.38268313, +-0.19509038, +0.000000011924881, +0.19509041, +0.3826836, +0.5555704, +0.707107, +0.8314696, +0.92387956, +0.9807853, +1, +0.98078525, +0.9238795, +0.8314696, +0.70710677, +0.5555702, +0.38268343, +0.19509023, +-0.00000004371139, +-0.19509032, +-0.38268352, +-0.55557036, +-0.70710677, +-0.83146966, +-0.9238796, +-0.9807853, +-1, +-0.98078525, +-0.9238795, +-0.83146954, +-0.70710665, +-0.55557, +-0.38268313, +-0.19509038, +0.000000011924881, +0.19509041, +0.3826836, +0.5555704, +0.707107, +0.8314696, +0.92387956, +0.9807853, +1, +0.98078525, +0.9238795, +0.8314696, +0.70710677, +0.5555702, +0.38268343, +0.19509023, +-0.00000004371139, +-0.19509032, +-0.38268352, +-0.55557036, +-0.70710677, +-0.83146966, +-0.9238796, +-0.9807853, +-1, +-0.98078525, +-0.9238795, +-0.83146954, +-0.70710665, +-0.55557, +-0.38268313, +-0.19509038, +0.000000011924881, +0.19509041, +0.3826836, +0.5555704, +0.707107, +0.8314696, +0.92387956, +0.9807853, +1, +0.98078525, +0.9238795, +0.8314696, +0.70710677, +0.5555702, +0.38268343, +0.19509023, +-0.00000004371139, +-0.19509032, +-0.38268352, +-0.55557036, +-0.70710677, +-0.83146966, +-0.9238796, +-0.9807853, +-1, +-0.98078525, +-0.9238795, +-0.83146954, +-0.70710665, +-0.55557, +-0.38268313, +-0.19509038, +0.000000011924881, +0.19509041, +0.3826836, +0.5555704, +0.707107, +0.8314696, +0.92387956, +0.9807853, +1, +0.98078525, +0.9238795, +0.8314696, +0.70710677, +0.5555702, +0.38268343, +0.19509023, +-0.00000004371139, +-0.19509032, +-0.38268352, +-0.55557036, +-0.70710677, +-0.83146966, +-0.9238796, +-0.9807853, +-1, +-0.98078525, +-0.9238795, +-0.83146954, +-0.70710665, +-0.55557, +-0.38268313, +-0.19509038, +0.000000011924881, +0.19509041, +0.3826836, +0.5555704, +0.707107, +0.8314696, +0.92387956, +0.9807853, +1, +0.98078525, +0.9238795, +0.8314696, +0.70710677, +0.5555702, +0.38268343, +0.19509023, +-0.00000004371139, +-0.19509032, +-0.38268352, +-0.55557036, +-0.70710677, +-0.83146966, +-0.9238796, +-0.9807853, +-1, +-0.98078525, +-0.9238795, +-0.83146954, +-0.70710665, +-0.55557, +-0.38268313, +-0.19509038, diff --git a/sine.wav b/sine.wav new file mode 100644 index 0000000..58e479c Binary files /dev/null and b/sine.wav differ diff --git a/src/main.rs b/src/main.rs index ea71d31..e68554c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,102 +1,59 @@ +use std::any; +use std::collections::VecDeque; +use std::collections::btree_map::RangeMut; +use std::f64::consts::PI; use std::fmt::Display; +use std::fs::File; +use std::io::Write; +use std::time::Duration; +use cpal::default_host; +use cpal::traits::DeviceTrait; +use cpal::traits::HostTrait; +use eframe::NativeOptions; +use egui::Color32; +use egui::IntoAtoms; +use egui_plot::Line; +use egui_plot::Plot; +use egui_plot::PlotPoint; +use egui_plot::PlotPoints; use ntw_dsp::Frequency; +use ntw_dsp::blocks::early_late_gate::EarlyLateGate; +use ntw_dsp::blocks::early_late_gate::EyeExtractor; +use ntw_dsp::blocks::fft::Fft; +use ntw_dsp::blocks::fir::Fir; +use ntw_dsp::blocks::fir::FirFft; +use ntw_dsp::blocks::iir::SimpleDcBlock; +use ntw_dsp::blocks::iq::IqSampler; +use ntw_dsp::blocks::iter::FiniteIterSource; use ntw_dsp::blocks::map::Map; +use ntw_dsp::blocks::math::Multiplier; use ntw_dsp::blocks::nco::ComplexNco; +use ntw_dsp::blocks::oscillator::ComplexOscillator; +use ntw_dsp::blocks::tee::Tee; +use ntw_dsp::blocks::utilities::ChannelSink; +use ntw_dsp::blocks::utilities::ChannelSource; +use ntw_dsp::blocks::utilities::Repeat; +use ntw_dsp::blocks::utilities::SimpleAgc; +use ntw_dsp::blocks::utilities::SimpleSquelch; +use ntw_dsp::blocks::utilities::Windows; +use ntw_dsp::filtering::fir::estimate_fir_length; +use ntw_dsp::filtering::impulse_response::ImpulseResponse; +use ntw_dsp::filtering::impulse_response::window; use ntw_dsp::generation::Nco; -use ntw_flowgraph::Block; +use ntw_flowgraph::BlockResult; use ntw_flowgraph::BlockWork; +use ntw_flowgraph::graph; use ntw_flowgraph::graph::Graph; use ntw_flowgraph::inout::In; -use ntw_flowgraph::inout::Out; -use ntw_flowgraph::inout::Stream; use ntw_flowgraph_macros::Block; +use num::Complex; +use num::One; +use num::Zero; +use num::complex::Complex32; +use rand::random; use ringbuf::traits::Consumer; -use ringbuf::traits::Observer; -use ringbuf::traits::Producer; - -#[derive(Block)] -pub struct VecSource -{ - vector: Vec, - - #[output] - out: Out, -} - -impl BlockWork for VecSource -{ - fn work(&mut self) - { - while let Some(element) = self.vector.pop() - { - match self.out.rb.try_push(element) - { - Ok(()) => - {} - Err(x) => - { - self.vector.push(x); - break; - } - } - } - } - - fn ready(&self) -> bool - { - !self.vector.is_empty() && self.out.vacant_len() > 0 - } -} - -impl VecSource -{ - pub fn new(vector: Vec) -> (VecSource, In) - { - let (out, stream) = Stream::make(16); - (VecSource { vector, out }, stream) - } -} - -#[derive(Block)] -pub struct Adder -{ - #[input] - in_a: In, - - #[input] - in_b: In, - - #[output] - out: Out, -} - -impl BlockWork for Adder -{ - fn work(&mut self) - { - while let Some(a) = self.in_a.rb.try_pop() - && let Some(b) = self.in_b.rb.try_pop() - && self.out.rb.vacant_len() > 0 - { - let _ = self.out.try_push(a + b); - } - } - - fn ready(&self) -> bool - { - self.in_a.available_len() > 0 && self.in_b.available_len() > 0 && self.out.vacant_len() > 0 - } -} - -impl Adder -{ - pub fn new(in_a: In, in_b: In) -> (Adder, In) - { - let (out, stream) = Stream::make(16); - (Adder { in_a, in_b, out }, stream) - } -} +use rustfft::FftDirection; #[derive(Block)] pub struct PrintSink @@ -107,15 +64,16 @@ pub struct PrintSink impl BlockWork for PrintSink { - fn work(&mut self) + fn work(&mut self) -> BlockResult { if let Some(x) = self.stream.rb.try_pop() { println!("{x}"); } + BlockResult::Ok } - fn ready(&self) -> bool + fn ready(&mut self) -> bool { self.stream.available_len() > 0 } @@ -129,17 +87,245 @@ impl PrintSink } } +const SAMPLE_RATE: usize = 48_000; +const FREQUENCY_OFFSET: usize = 1000; +const CARRIER_FREQUENCY: usize = 1700; +const SAMPLES_PER_SYMBOL: usize = 40; + fn main() { - let (nco, out) = ComplexNco::::new(Nco::new(Frequency::from_rad(0.001))); - let (map, im) = Map::new(out, |x| x.im); - let printer = PrintSink::new(im); - - let mut graph = Graph::new(); - - graph.add_block(printer); - graph.add_block(map); - graph.add_block(nco); - - graph.run(); + modulate(); + demodulate(); +} + +fn demodulate() +{ + let host = cpal::default_host(); + let device = host + .default_input_device() + .expect("no output device available"); + println!("input device: {}", device.description().unwrap()); + let mut supported_configs_range = device + .supported_input_configs() + .expect("error while querying configs"); + let supported_config = supported_configs_range + .next() + .expect("no supported config?!") + .with_sample_rate(SAMPLE_RATE as u32); + + // Synthetise baseband filter + let baseband_fir_len = estimate_fir_length(500., SAMPLE_RATE as f32) as usize; + let cutoff_bin = + ((Frequency::from_frequency(FREQUENCY_OFFSET as f64 + 100., SAMPLE_RATE as f64).as_rad() + / (2. * PI)) + * baseband_fir_len as f64) as usize; + let mut transfer_function = vec![Complex32::zero(); baseband_fir_len]; + for i in 0..cutoff_bin + { + transfer_function[i] = Complex32::one(); + transfer_function[baseband_fir_len - 1 - i] = Complex32::one(); + } + let baseband_fir = ImpulseResponse::from_transfer_function(transfer_function.as_slice()) + .normalized() + .windowed(window::blackmann); + + let mut reader = hound::WavReader::open("mod.wav").unwrap(); + let (audio_tx, audio_rx) = std::sync::mpsc::sync_channel(100_000); + let (eye_tx, eye_rx) = std::sync::mpsc::channel(); + + let (input_block, input) = ChannelSource::new(audio_rx); + let (iq_sampler, iq) = IqSampler::::new( + input, + Frequency::from_frequency(CARRIER_FREQUENCY as f64, SAMPLE_RATE as f64), + ); + let (fir_block, iq) = Fir::new(iq, baseband_fir); + let (sq_block, iq) = SimpleSquelch::new(iq, 300, 0.005); + //let (agc_block, iq) = SimpleAgc::new(iq, 200); + let (window_block, windows) = Windows::<_, 2>::new(iq); + let (diff_block, angle) = Map::new(windows, |[a, b]| (a / b).arg() * 15.); + //let (dc_block, angle) = SimpleDcBlock::new(angle, 0.99.into()); + let (low_pass_block, angle) = Fir::new( + angle, + ImpulseResponse(vec![1.; SAMPLES_PER_SYMBOL / 2]).normalized(), + ); + + let mut pi = vec![1. / 30.; 50]; + *pi.last_mut().unwrap() = 1.; + let (elg_block, samples) = EarlyLateGate::new(angle, ImpulseResponse(pi), SAMPLES_PER_SYMBOL); + let eye_block = EyeExtractor::new(samples, eye_tx, SAMPLES_PER_SYMBOL); + + let graph = graph![ + input_block, + iq_sampler, + window_block, + diff_block, + elg_block, + low_pass_block, + eye_block, + fir_block, + sq_block, + //dc_block //fir_block + ]; + graph.run(); + + // let samples = reader.samples().map(|x| x.unwrap()).collect::>(); + // std::thread::spawn(move || { + // loop + // { + // samples + // .iter() + // //.skip(rand::random_range(0..100)) + // .map(|x| *x as f32 / i16::MAX as f32) + // .for_each(|x| audio_tx.send(x).unwrap()); + // } + // }); + + let stream = device.build_input_stream( + &supported_config.into(), + move |data: &[f32], _: &cpal::InputCallbackInfo| { + data.iter().for_each(|x| { + let _ = audio_tx.send(*x / 2.); + }); + }, + move |err| { + // react to errors here. + }, + None, // None=blocking, Some(Duration)=timeout + ); + + let mut eyes = VecDeque::new(); + println!("Running ui"); + eframe::run_simple_native("Demod", NativeOptions::default(), move |ctx, _frame| { + while let Ok(x) = eye_rx.try_recv() + { + eyes.push_back(x); + } + + while eyes.len() > 300 + { + eyes.pop_front(); + } + + egui::CentralPanel::default().show(ctx, |ui| { + egui_plot::Plot::new("Demod").show(ui, |plot_ui| { + for eye in eyes.iter() + { + plot_ui.line( + Line::new( + "Angle", + eye.iter() + .enumerate() + .map(|(i, x)| [i as f64, *x as f64]) + .collect::>(), + ) + .color(Color32::GREEN), + ); + } + }); + }); + std::thread::sleep(Duration::from_millis(10)); + ctx.request_repaint(); + }) + .unwrap(); +} + +fn modulate() +{ + // Simple FSK modulation + let data = (0u8..=255u8) + .map(|_| rand::random::()) + .flat_map(to_bits); // Data to modulate + let frequency_offset = Frequency::from_frequency(FREQUENCY_OFFSET as f64, SAMPLE_RATE as f64); // Bandwidth + + let (bit_stream, bits) = FiniteIterSource::new(data, 255 * 8); // Iterator on data to modulate + let (map, freq) = Map::new(bits, move |bit| [1., -1.][bit as usize]); // Computes frequency offset based on bit + let (hold, freq) = Repeat::new(freq, SAMPLES_PER_SYMBOL); // Holds that frequency for 100 samples/symbol + let (freq_fir, freq) = Fir::new( + freq, + ImpulseResponse( + (0..SAMPLES_PER_SYMBOL) + .map(|t| gaussian(0.3, t as f32 / SAMPLES_PER_SYMBOL as f32)) + .collect(), + ) + .normalized(), + ); + let (bit_to_freq, freq) = Map::new(freq, |x| { + Frequency::from_frequency(FREQUENCY_OFFSET as f64 * x as f64, SAMPLE_RATE as f64) + }); + let (baseband_nco, baseband) = ComplexNco::::new(freq); // Baseband oscillatore + let (local_o, lo) = ComplexOscillator::::new(Nco::new(Frequency::from_frequency( + CARRIER_FREQUENCY as f64, + SAMPLE_RATE as f64, + ))); // Upconverter + + let (prod_block, passband) = Multiplier::<_, _, Complex>::new(baseband, lo); // Multiply + let (output, rx) = ChannelSink::new(passband); // Output in channel + let graph = graph![ + bit_stream, + map, + output, + baseband_nco, + local_o, + hold, + prod_block, + freq_fir, + bit_to_freq + ]; + graph.run(); + + let mut output = vec![]; + while let Ok(x) = rx.recv() + { + output.push(x); + } + + println!("length: {}", output.len()); + + let spec = hound::WavSpec { + channels: 1, + sample_rate: 48000, + bits_per_sample: 16, + + sample_format: hound::SampleFormat::Int, + }; + let mut writer = hound::WavWriter::create("mod.wav", spec).unwrap(); + for t in output + { + let amplitude = i16::MAX as f32; + writer + .write_sample(((t.re + rand::random::() * 0.0) * amplitude) as i16) + .unwrap(); + } +} + +pub fn to_bits(n: u8) -> [bool; 8] +{ + [ + (n & 1) == 1, + (n >> 1) & 1 == 1, + (n >> 2) & 1 == 1, + (n >> 3) & 1 == 1, + (n >> 4) & 1 == 1, + (n >> 5) & 1 == 1, + (n >> 6) & 1 == 1, + (n >> 7) & 1 == 1, + ] +} + +pub fn from_bits(n: [bool; 8]) -> u8 +{ + (n[0] as u8) + | ((n[1] as u8) << 1) + | ((n[2] as u8) << 2) + | ((n[3] as u8) << 3) + | ((n[4] as u8) << 4) + | ((n[5] as u8) << 5) + | ((n[6] as u8) << 6) + | ((n[7] as u8) << 7) +} + +pub fn gaussian(sigma: f32, t: f32) -> f32 +{ + let sq = (t - 0.5) / sigma; + (-sq * sq).exp() }