From f74c5b474c919b2a7bad55672047a192199add3c Mon Sep 17 00:00:00 2001 From: JOLIMAITRE Matthieu Date: Sat, 6 Jan 2024 00:51:15 +0100 Subject: [PATCH] marche --- .gitignore | 1 + Cargo.lock | 1877 +++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 17 + assets/ding.ogg | Bin 0 -> 41033 bytes src/main.rs | 163 ++++ src/state.rs | 100 +++ 6 files changed, 2158 insertions(+) create mode 100644 .gitignore create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 assets/ding.ogg create mode 100644 src/main.rs create mode 100644 src/state.rs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/target diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..0595382 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,1877 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "aho-corasick" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +dependencies = [ + "memchr", +] + +[[package]] +name = "alsa" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2562ad8dcf0f789f65c6fdaad8a8a9708ed6b488e649da28c01656ad66b8b47" +dependencies = [ + "alsa-sys", + "bitflags 1.3.2", + "libc", + "nix", +] + +[[package]] +name = "alsa-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db8fee663d06c4e303404ef5f40488a53e062f89ba8bfed81f42325aafad1527" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "anyhow" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca" + +[[package]] +name = "arrayvec" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" + +[[package]] +name = "async-channel" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ca33f4bc4ed1babef42cad36cc1f51fa88be00420404e5b1e80ab1b18f7678c" +dependencies = [ + "concurrent-queue", + "event-listener", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "bindgen" +version = "0.69.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ffcebc3849946a7170a05992aac39da343a90676ab392c51a4280981d6379c2" +dependencies = [ + "bitflags 2.4.1", + "cexpr", + "clang-sys", + "lazy_static", + "lazycell", + "peeking_take_while", + "proc-macro2", + "quote", + "regex", + "rustc-hash", + "shlex", + "syn 2.0.48", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" + +[[package]] +name = "bumpalo" +version = "3.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" + +[[package]] +name = "bytemuck" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" + +[[package]] +name = "cairo-rs" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" +dependencies = [ + "bitflags 2.4.1", + "cairo-sys-rs", + "glib", + "libc", + "once_cell", + "thiserror", +] + +[[package]] +name = "cairo-sys-rs" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "685c9fa8e590b8b3d678873528d83411db17242a73fccaed827770ea0fedda51" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + +[[package]] +name = "cc" +version = "1.0.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +dependencies = [ + "jobserver", + "libc", +] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cexpr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom", +] + +[[package]] +name = "cfg-expr" +version = "0.15.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6100bc57b6209840798d95cb2775684849d332f7bd788db2a8c8caf7ef82a41a" +dependencies = [ + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "clang-sys" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67523a3b4be3ce1989d607a828d036249522dd9c1c8de7f4dd2dae43a37369d1" +dependencies = [ + "glob", + "libc", + "libloading", +] + +[[package]] +name = "claxon" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bfbf56724aa9eca8afa4fcfadeb479e722935bb2a0900c2d37e0cc477af0688" + +[[package]] +name = "combine" +version = "4.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35ed6e9d84f0b51a7f52daf1c7d71dd136fd7a3f41a8462b8cdb8c78d920fad4" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "concurrent-queue" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d16048cd947b08fa32c24458a22f5dc5e835264f689f4f5653210c69fd107363" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" + +[[package]] +name = "coreaudio-rs" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "321077172d79c662f64f5071a03120748d5bb652f5231570141be24cfcd2bace" +dependencies = [ + "bitflags 1.3.2", + "core-foundation-sys", + "coreaudio-sys", +] + +[[package]] +name = "coreaudio-sys" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f01585027057ff5f0a5bf276174ae4c1594a2c5bde93d5f46a016d76270f5a9" +dependencies = [ + "bindgen", +] + +[[package]] +name = "cpal" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d959d90e938c5493000514b446987c07aed46c668faaa7d34d6c7a67b1a578c" +dependencies = [ + "alsa", + "core-foundation-sys", + "coreaudio-rs", + "dasp_sample", + "jni 0.19.0", + "js-sys", + "libc", + "mach2", + "ndk", + "ndk-context", + "oboe", + "once_cell", + "parking_lot", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows 0.46.0", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3a430a770ebd84726f584a90ee7f020d28db52c6d02138900f22341f866d39c" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "dasp_sample" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c87e182de0887fd5361989c677c4e8f5000cd9491d6d563161a8f3a5519fc7f" + +[[package]] +name = "encoding_rs" +version = "0.8.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "event-listener" +version = "4.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "218a870470cce1469024e9fb66b901aa983929d81304a1cdb299f28118e550d5" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "958e4d70b6d5e81971bebec42271ec641e7ff4e170a6fa605f2b8a8b65cb97d3" +dependencies = [ + "event-listener", + "pin-project-lite", +] + +[[package]] +name = "field-offset" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f" +dependencies = [ + "memoffset", + "rustc_version", +] + +[[package]] +name = "futures-channel" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +dependencies = [ + "futures-core", +] + +[[package]] +name = "futures-core" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" + +[[package]] +name = "futures-executor" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" + +[[package]] +name = "futures-macro" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "futures-task" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" + +[[package]] +name = "futures-util" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +dependencies = [ + "futures-core", + "futures-macro", + "futures-task", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "gdk-pixbuf" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50e1f5f1b0bfb830d6ccc8066d18db35c487b1b2b1e8589b5dfe9f07e8defaec" +dependencies = [ + "gdk-pixbuf-sys", + "gio", + "glib", + "libc", + "once_cell", +] + +[[package]] +name = "gdk-pixbuf-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9839ea644ed9c97a34d129ad56d38a25e6756f99f3a88e15cd39c20629caf7" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "gdk4" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edb019ad581f8ecf8ea8e4baa6df7c483a95b5a59be3140be6a9c3b0c632af6" +dependencies = [ + "cairo-rs", + "gdk-pixbuf", + "gdk4-sys", + "gio", + "glib", + "libc", + "pango", +] + +[[package]] +name = "gdk4-sys" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbab43f332a3cf1df9974da690b5bb0e26720ed09a228178ce52175372dcfef0" +dependencies = [ + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "pkg-config", + "system-deps", +] + +[[package]] +name = "generator" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cc16584ff22b460a382b7feec54b23d2908d858152e5739a120b949293bd74e" +dependencies = [ + "cc", + "libc", + "log", + "rustversion", + "windows 0.48.0", +] + +[[package]] +name = "gio" +version = "0.18.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fc8f532f87b79cbc51a79748f16a6828fb784be93145a322fa14d06d354c73" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "gio-sys", + "glib", + "libc", + "once_cell", + "pin-project-lite", + "smallvec", + "thiserror", +] + +[[package]] +name = "gio-sys" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37566df850baf5e4cb0dfb78af2e4b9898d817ed9263d1090a2df958c64737d2" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", + "winapi", +] + +[[package]] +name = "glib" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" +dependencies = [ + "bitflags 2.4.1", + "futures-channel", + "futures-core", + "futures-executor", + "futures-task", + "futures-util", + "gio-sys", + "glib-macros", + "glib-sys", + "gobject-sys", + "libc", + "memchr", + "once_cell", + "smallvec", + "thiserror", +] + +[[package]] +name = "glib-macros" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc" +dependencies = [ + "heck", + "proc-macro-crate 2.0.1", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "glib-sys" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "063ce2eb6a8d0ea93d2bf8ba1957e78dbab6be1c2220dd3daca57d5a9d869898" +dependencies = [ + "libc", + "system-deps", +] + +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + +[[package]] +name = "gobject-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0850127b514d1c4a4654ead6dedadb18198999985908e6ffe4436f53c785ce44" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + +[[package]] +name = "graphene-rs" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b2228cda1505613a7a956cca69076892cfbda84fc2b7a62b94a41a272c0c401" +dependencies = [ + "glib", + "graphene-sys", + "libc", +] + +[[package]] +name = "graphene-sys" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc4144cee8fc8788f2a9b73dc5f1d4e1189d1f95305c4cb7bd9c1af1cfa31f59" +dependencies = [ + "glib-sys", + "libc", + "pkg-config", + "system-deps", +] + +[[package]] +name = "gsk4" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d958e351d2f210309b32d081c832d7de0aca0b077aa10d88336c6379bd01f7e" +dependencies = [ + "cairo-rs", + "gdk4", + "glib", + "graphene-rs", + "gsk4-sys", + "libc", + "pango", +] + +[[package]] +name = "gsk4-sys" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12bd9e3effea989f020e8f1ff3fa3b8c63ba93d43b899c11a118868853a56d55" +dependencies = [ + "cairo-sys-rs", + "gdk4-sys", + "glib-sys", + "gobject-sys", + "graphene-sys", + "libc", + "pango-sys", + "system-deps", +] + +[[package]] +name = "gtk4" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aeb51aa3e9728575a053e1f43543cd9992ac2477e1b186ad824fd4adfb70842" +dependencies = [ + "cairo-rs", + "field-offset", + "futures-channel", + "gdk-pixbuf", + "gdk4", + "gio", + "glib", + "graphene-rs", + "gsk4", + "gtk4-macros", + "gtk4-sys", + "libc", + "pango", +] + +[[package]] +name = "gtk4-macros" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d57ec49cf9b657f69a05bca8027cff0a8dfd0c49e812be026fc7311f2163832f" +dependencies = [ + "anyhow", + "proc-macro-crate 1.3.1", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "gtk4-sys" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54d8c4aa23638ce9faa2caf7e2a27d4a1295af2155c8e8d28c4d4eeca7a65eb8" +dependencies = [ + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gdk4-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "graphene-sys", + "gsk4-sys", + "libc", + "pango-sys", + "system-deps", +] + +[[package]] +name = "hashbrown" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "hound" +version = "3.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62adaabb884c94955b19907d60019f4e145d091c75345379e70d1ee696f7854f" + +[[package]] +name = "indexmap" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "jni" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6df18c2e3db7e453d3c6ac5b3e9d5182664d28788126d39b91f2d1e22b017ec" +dependencies = [ + "cesu8", + "combine", + "jni-sys", + "log", + "thiserror", + "walkdir", +] + +[[package]] +name = "jni" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "039022cdf4d7b1cf548d31f60ae783138e5fd42013f6271049d7df7afadef96c" +dependencies = [ + "cesu8", + "combine", + "jni-sys", + "log", + "thiserror", + "walkdir", +] + +[[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.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d" +dependencies = [ + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cee9c64da59eae3b50095c18d3e74f8b73c0b86d2792824ff01bbce68ba229ca" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "lazycell" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" + +[[package]] +name = "lewton" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "777b48df9aaab155475a83a7df3070395ea1ac6902f5cd062b8f2b028075c030" +dependencies = [ + "byteorder", + "ogg", + "tinyvec", +] + +[[package]] +name = "libc" +version = "0.2.151" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" + +[[package]] +name = "libloading" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c571b676ddfc9a8c12f1f3d3085a7b163966a8fd8098a90640953ce5f6170161" +dependencies = [ + "cfg-if", + "windows-sys", +] + +[[package]] +name = "lock_api" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" + +[[package]] +name = "loom" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff50ecb28bb86013e935fb6683ab1f6d3a20016f123c76fd4c27470076ac30f5" +dependencies = [ + "cfg-if", + "generator", + "pin-utils", + "scoped-tls", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "mach2" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709" +dependencies = [ + "libc", +] + +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata 0.1.10", +] + +[[package]] +name = "memchr" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" + +[[package]] +name = "memoffset" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" +dependencies = [ + "autocfg", +] + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "ndk" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "451422b7e4718271c8b5b3aadf5adedba43dc76312454b387e98fae0fc951aa0" +dependencies = [ + "bitflags 1.3.2", + "jni-sys", + "ndk-sys", + "num_enum", + "raw-window-handle", + "thiserror", +] + +[[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.4.1+23.1.7779620" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cf2aae958bd232cac5069850591667ad422d263686d75b52a065f9badeee5a3" +dependencies = [ + "jni-sys", +] + +[[package]] +name = "nix" +version = "0.24.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa52e972a9a719cecb6864fb88568781eb706bac2cd1d4f04a648542dbf78069" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "libc", +] + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + +[[package]] +name = "num-derive" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "num-traits" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_enum" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "oboe" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8868cc237ee02e2d9618539a23a8d228b9bb3fc2e7a5b11eed3831de77c395d0" +dependencies = [ + "jni 0.20.0", + "ndk", + "ndk-context", + "num-derive", + "num-traits", + "oboe-sys", +] + +[[package]] +name = "oboe-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f44155e7fb718d3cfddcf70690b2b51ac4412f347cd9e4fbe511abe9cd7b5f2" +dependencies = [ + "cc", +] + +[[package]] +name = "ogg" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6951b4e8bf21c8193da321bcce9c9dd2e13c858fe078bf9054a288b419ae5d6e" +dependencies = [ + "byteorder", +] + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "oneshot" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f6640c6bda7731b1fdbab747981a0f896dd1fedaf9f4a53fa237a04a84431f4" +dependencies = [ + "loom", +] + +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + +[[package]] +name = "pango" +version = "0.18.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ca27ec1eb0457ab26f3036ea52229edbdb74dee1edd29063f5b9b010e7ebee4" +dependencies = [ + "gio", + "glib", + "libc", + "once_cell", + "pango-sys", +] + +[[package]] +name = "pango-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436737e391a843e5933d6d9aa102cb126d501e815b83601365a948a518555dc5" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "parking" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" + +[[package]] +name = "parking_lot" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.48.5", +] + +[[package]] +name = "peeking_take_while" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" + +[[package]] +name = "pin-project-lite" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkg-config" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69d3587f8a9e599cc7ec2c00e331f71c4e69a5f9a4b8a6efd5b07466b9736f9a" + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit 0.19.15", +] + +[[package]] +name = "proc-macro-crate" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97dc5fea232fc28d2f597b37c4876b348a40e33f3b02cc975c8d006d78d94b1a" +dependencies = [ + "toml_datetime", + "toml_edit 0.20.2", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "1.0.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "907a61bd0f64c2f29cd1cf1dc34d05176426a3f504a78010f08416ddb7b13708" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "raw-window-handle" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" + +[[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 = "regex" +version = "1.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata 0.4.3", + "regex-syntax 0.8.2", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", +] + +[[package]] +name = "regex-automata" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.8.2", +] + +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + +[[package]] +name = "regex-syntax" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" + +[[package]] +name = "rodio" +version = "0.17.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b1bb7b48ee48471f55da122c0044fcc7600cfcc85db88240b89cb832935e611" +dependencies = [ + "claxon", + "cpal", + "hound", + "lewton", + "symphonia", +] + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + +[[package]] +name = "rustversion" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" + +[[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 = "semver" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0" + +[[package]] +name = "serde" +version = "1.0.194" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b114498256798c94a0689e1a15fec6005dee8ac1f41de56404b67afc2a4b773" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.194" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3385e45322e8f9931410f01b3031ec534c3947d0e94c18049af4d9f9907d4e0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "serde_spanned" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" +dependencies = [ + "serde", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shlex" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7cee0529a6d40f580e7a5e6c495c8fbfe21b7b52795ed4bb5e62cdf92bc6380" + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" + +[[package]] +name = "symphonia" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62e48dba70095f265fdb269b99619b95d04c89e619538138383e63310b14d941" +dependencies = [ + "lazy_static", + "symphonia-bundle-mp3", + "symphonia-core", + "symphonia-metadata", +] + +[[package]] +name = "symphonia-bundle-mp3" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f31d7fece546f1e6973011a9eceae948133bbd18fd3d52f6073b1e38ae6368a" +dependencies = [ + "bitflags 1.3.2", + "lazy_static", + "log", + "symphonia-core", + "symphonia-metadata", +] + +[[package]] +name = "symphonia-core" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c73eb88fee79705268cc7b742c7bc93a7b76e092ab751d0833866970754142" +dependencies = [ + "arrayvec", + "bitflags 1.3.2", + "bytemuck", + "lazy_static", + "log", +] + +[[package]] +name = "symphonia-metadata" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89c3e1937e31d0e068bbe829f66b2f2bfaa28d056365279e0ef897172c3320c0" +dependencies = [ + "encoding_rs", + "lazy_static", + "log", + "symphonia-core", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "system-deps" +version = "6.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a2d580ff6a20c55dfb86be5f9c238f67835d0e81cbdea8bf5680e0897320331" +dependencies = [ + "cfg-expr", + "heck", + "pkg-config", + "toml", + "version-compare", +] + +[[package]] +name = "target-lexicon" +version = "0.12.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69758bda2e78f098e4ccb393021a0963bb3442eac05f135c30f61b7370bbafae" + +[[package]] +name = "thiserror" +version = "1.0.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d54378c645627613241d077a3a79db965db602882668f9136ac42af9ecb730ad" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa0faa943b50f3db30a20aa7e265dbc66076993efed8463e8de414e5d06d3471" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "thread_local" +version = "1.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" +dependencies = [ + "cfg-if", + "once_cell", +] + +[[package]] +name = "timeurs" +version = "0.1.0" +dependencies = [ + "async-channel", + "gtk4", + "oneshot", + "rodio", +] + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "toml" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit 0.20.2", +] + +[[package]] +name = "toml_datetime" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap", + "toml_datetime", + "winnow", +] + +[[package]] +name = "toml_edit" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + +[[package]] +name = "tracing" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + +[[package]] +name = "version-compare" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "579a42fc0b8e0c63b76519a339be31bed574929511fa53c1a3acae26eb258f29" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "walkdir" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ed0d4f68a3015cc185aff4db9506a015f4b96f95303897bfa23f846db54064e" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b56f625e64f3a1084ded111c4d5f477df9f8c92df113852fa5a374dbda78826" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.48", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac36a15a220124ac510204aec1c3e5db8a22ab06fd6706d881dc6149f8ed9a12" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0162dbf37223cd2afce98f3d0785506dcb8d266223983e4b5b525859e6e182b2" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f" + +[[package]] +name = "web-sys" +version = "0.3.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50c24a44ec86bb68fbecd1b3efed7e85ea5621b39b35ef2766b66cd984f8010f" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +dependencies = [ + "winapi", +] + +[[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.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdacb41e6a96a052c6cb63a144f24900236121c6f63f4f8219fef5977ecb0c25" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[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.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows_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.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[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.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[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.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[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.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[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.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[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.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[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.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "winnow" +version = "0.5.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8434aeec7b290e8da5c3f0d628cb0eac6cabcb31d14bb74f779a08109a5914d6" +dependencies = [ + "memchr", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..c8f63ef --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "timeurs" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +async-channel = "2.1" +gtk = { version = "0.7", package = "gtk4", features = ["v4_12"] } +oneshot = "0.1" +rodio = "0.17" + +[profile.release] +strip = true +lto = true +codegen-units = 1 diff --git a/assets/ding.ogg b/assets/ding.ogg new file mode 100644 index 0000000000000000000000000000000000000000..9dcb27bdf5644a2e728e98042e606ebe857b568a GIT binary patch literal 41033 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 literal 0 HcmV?d00001 diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..8ad9661 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,163 @@ +use std::ops::Mul; +use std::sync::mpsc::{self, Sender}; +use std::thread; +use std::time::Duration; + +use glib::clone; +use gtk::prelude::*; +use gtk::{glib, Application, ApplicationWindow, Button, Entry, Label, Orientation}; +use state::{Cmd, State}; + +fn main() -> glib::ExitCode { + // Create a new application + let app = Application::builder() + .application_id("org.gtk_rs.HelloWorld2") + .build(); + + let (send, rec) = mpsc::channel(); + thread::spawn(move || { + State::initial().spin(rec); + }); + + app.connect_activate(move |app| build_ui(app, send.clone())); + app.run() +} +mod state; +fn build_ui(app: &Application, cmd: Sender) { + let label = Label::builder().label("-").build(); + + // entry + let entry = Entry::builder().text("0:00:10").build(); + let set_button = Button::builder().label("set").build(); + let entry_container = gtk::Box::builder() + .orientation(Orientation::Horizontal) + .spacing(8) + .build(); + entry_container.append(&entry); + entry_container.append(&set_button); + + let passed = cmd.clone(); + set_button.connect_clicked(move |_| { + let cmd = &passed; + let inputted = entry.text().to_string(); + let inputted = parse_input_time(&inputted); + cmd.send(Cmd::SetInput(inputted)).unwrap(); + cmd.send(Cmd::Reset).unwrap(); + }); + + // pause & reset + let pause_button = Button::builder().label("start").build(); + let reset_button = Button::builder().label("reset").build(); + let button_container = gtk::Box::builder() + .orientation(Orientation::Horizontal) + .spacing(8) + .build(); + button_container.append(&pause_button); + button_container.append(&reset_button); + + let passed = cmd.clone(); + pause_button.connect_clicked(move |button| { + let cmd = &passed; + cmd.send(Cmd::TogglePaused).unwrap(); + let (send, rec) = oneshot::channel(); + cmd.send(Cmd::GetIsPaused(send)).unwrap(); + let is_paused = rec.recv().unwrap(); + button.set_label(if is_paused { "start" } else { "pause" }); + }); + + let passed = cmd.clone(); + reset_button.connect_clicked(move |_| { + let cmd = &passed; + pause_button.set_label("start"); + cmd.send(Cmd::Reset).unwrap(); + }); + + // container + let container = gtk::Box::builder() + .orientation(Orientation::Vertical) + .spacing(8) + .margin_top(12) + .margin_bottom(12) + .margin_start(12) + .margin_end(12) + .build(); + container.append(&label); + container.append(&entry_container); + container.append(&button_container); + + let passed = cmd.clone(); + glib::spawn_future_local(clone!(@weak label => async move { + let cmd = &passed; + loop { + glib::timeout_future(Duration::from_millis(10)).await; + let (send, rec) = oneshot::channel(); + cmd.send(Cmd::GetTime(send)).unwrap(); + let time = rec.recv().unwrap(); + label.set_text(&format_time(time)); + } + })); + + let window = ApplicationWindow::builder() + .application(app) + .title("My GTK App") + .child(&container) + .build(); + window.present(); +} + +fn parse_input_time(inputted: &str) -> f32 { + fn parse_empty_zero(input: &str) -> i32 { + if input.is_empty() { + return 0; + } + input.parse().unwrap() + } + inputted + .split(':') + .collect::>() + .iter() + .rev() + .map(|part| parse_empty_zero(part)) + .enumerate() + .map(|(index, item)| 60i32.pow(index as u32) * item) + .sum::() as f32 +} + +#[test] +fn test_parse_input_time() { + assert_eq!(parse_input_time(""), 0f32); + assert_eq!(parse_input_time(":"), 0f32); + assert_eq!(parse_input_time("3"), 3f32); + assert_eq!(parse_input_time(":3"), 3f32); + assert_eq!(parse_input_time("3:"), 180f32); + assert_eq!(parse_input_time(":3:"), 180f32); + assert_eq!(parse_input_time("3::"), 10800f32); +} + +fn format_time(input: f32) -> String { + // les maths 🧙 + let decimal = input.rem_euclid(1.).mul(100.) as i32; + let rest = input.div_euclid(1.); + let secs = rest.rem_euclid(60.) as i32; + let rest = rest.div_euclid(60.); + let min = rest.rem_euclid(60.) as i32; + let hours = rest.div_euclid(60.) as i32; + match (hours == 0, min == 0) { + (true, true) => format!("{secs}.{decimal:02}"), + (true, _) => format!("{min}:{secs:02}.{decimal:02}"), + _ => format!("{hours}:{min:02}:{secs:02}.{decimal:02}"), + } +} + +#[test] +fn test_format_time() { + assert_eq!(format_time(0.), "0.00"); + assert_eq!(format_time(0.5), "0.50"); + assert_eq!(format_time(0.25), "0.25"); + assert_eq!(format_time(10.), "10.00"); + assert_eq!(format_time(60.), "1:00.00"); + assert_eq!(format_time(600.), "10:00.00"); + assert_eq!(format_time(3600.), "1:00:00.00"); + assert_eq!(format_time(3600.5), "1:00:00.50"); + assert_eq!(format_time(3660.5), "1:01:00.50"); +} diff --git a/src/state.rs b/src/state.rs new file mode 100644 index 0000000..b6f8b01 --- /dev/null +++ b/src/state.rs @@ -0,0 +1,100 @@ +use std::{io::Cursor, sync::mpsc, time::Instant}; + +use rodio::{OutputStream, OutputStreamHandle, Sink}; + +pub enum Cmd { + GetTime(oneshot::Sender), + GetIsPaused(oneshot::Sender), + SetInput(f32), + TogglePaused, + Reset, +} + +pub struct State { + stream: OutputStream, + stream_handle: OutputStreamHandle, + last_start: Instant, + input_time: f32, + ellapsed_at_last_pause: f32, + is_paused: bool, + reached_target: bool, + player: Option, +} + +impl State { + pub fn initial() -> Self { + let (stream, stream_handle) = OutputStream::try_default().unwrap(); + + Self { + stream, + stream_handle, + last_start: Instant::now(), + input_time: 0., + ellapsed_at_last_pause: 0., + is_paused: true, + reached_target: false, + player: None, + } + } + + pub fn spin(mut self, commands: mpsc::Receiver) { + while let Ok(cmd) = commands.recv() { + match cmd { + Cmd::GetTime(returns) => { + let mut total_ellapsed = self.ellapsed_at_last_pause; + if !self.is_paused { + total_ellapsed += self.ellapsed_since_last_start(); + } + let res = self.input_time - total_ellapsed; + if res < 0. && !self.reached_target { + self.reached_target = true; + self.start_playing(); + } + returns.send(res.max(0.)).ok(); // note : sends zero instead of negatives. + } + Cmd::GetIsPaused(returns) => { + returns.send(self.is_paused).ok(); + } + Cmd::SetInput(inputted) => { + self.input_time = inputted; + } + Cmd::TogglePaused => { + self.is_paused = !self.is_paused; + if self.is_paused { + self.ellapsed_at_last_pause += self.ellapsed_since_last_start(); + } else { + self.last_start = Instant::now(); + } + } + Cmd::Reset => { + self.is_paused = true; + self.ellapsed_at_last_pause = 0.; + self.reached_target = false; + self.stop_playing(); + } + } + } + } + + pub fn ellapsed_since_last_start(&self) -> f32 { + Instant::now().duration_since(self.last_start).as_secs_f32() + } + + pub fn start_playing(&mut self) { + println!("start"); + let cursed = Cursor::new(DING); + // let source = Decoder::new_mp3(cursed).unwrap(); + let control = self.stream_handle.play_once(cursed).unwrap(); + control.play(); + self.player.replace(control); + } + + pub fn stop_playing(&self) { + println!("stop"); + if let Some(player) = &self.player { + player.stop(); + } + } +} + +const DING: &[u8] = include_bytes!("../assets/ding.ogg");