From ba2eff82ac19f9261ab29e10d8f2c88ba6a82eae Mon Sep 17 00:00:00 2001 From: Michel Heily Date: Wed, 30 Sep 2020 00:27:00 +0300 Subject: [PATCH] platform/android: Big re-write of native interface Mainly convert mainloop and audio thread into native code for performance increase. (Calling into JNI every frame was costy) The code was cleaned up quite a bit, but I may have introduced new bugs in this process :< Former-commit-id: fdbc21b5ab39f3d2e36647fd1177dc9a84a16980 Former-commit-id: ac765dbee8c994e1b69cc694846511837c2685b9 --- Cargo.lock | 952 ++++++++++-------- bindings/rustboyadvance-jni/Cargo.toml | 4 +- .../rustboyadvance-jni/src/audio/connector.rs | 129 +++ bindings/rustboyadvance-jni/src/audio/mod.rs | 29 + .../rustboyadvance-jni/src/audio/thread.rs | 66 ++ bindings/rustboyadvance-jni/src/emulator.rs | 403 ++++++++ bindings/rustboyadvance-jni/src/lib.rs | 334 +++--- bindings/rustboyadvance-jni/src/rom_helper.rs | 38 +- core/src/lib.rs | 2 +- core/src/sound/mod.rs | 4 +- core/src/util.rs | 16 +- .../rustboyadvance/EmulatorBindings.java | 78 +- .../mrmichel/rustboyadvance/IAudioPlayer.java | 15 + .../rustboyadvance/IFrameRenderer.java | 5 + .../core => rustboyadvance}/Keypad.java | 28 +- .../core/AndroidAudioPlayer.java | 89 ++ .../rustdroid_emu/core/AudioThread.java | 47 - .../mrmichel/rustdroid_emu/core/Emulator.java | 76 +- .../rustdroid_emu/core/SnapshotManager.java | 3 +- .../rustdroid_emu/ui/EmulationThread.java | 47 +- .../rustdroid_emu/ui/EmulatorActivity.java | 66 +- .../mrmichel/rustdroid_emu/ui/ScreenView.java | 15 +- platform/rustboyadvance-sdl2/Cargo.toml | 2 +- platform/rustboyadvance-sdl2/src/audio.rs | 4 +- platform/rustboyadvance-wasm/src/emulator.rs | 6 +- 25 files changed, 1566 insertions(+), 892 deletions(-) create mode 100644 bindings/rustboyadvance-jni/src/audio/connector.rs create mode 100644 bindings/rustboyadvance-jni/src/audio/mod.rs create mode 100644 bindings/rustboyadvance-jni/src/audio/thread.rs create mode 100644 bindings/rustboyadvance-jni/src/emulator.rs create mode 100644 platform/android/app/src/main/java/com/mrmichel/rustboyadvance/IAudioPlayer.java create mode 100644 platform/android/app/src/main/java/com/mrmichel/rustboyadvance/IFrameRenderer.java rename platform/android/app/src/main/java/com/mrmichel/{rustdroid_emu/core => rustboyadvance}/Keypad.java (85%) create mode 100644 platform/android/app/src/main/java/com/mrmichel/rustdroid_emu/core/AndroidAudioPlayer.java delete mode 100644 platform/android/app/src/main/java/com/mrmichel/rustdroid_emu/core/AudioThread.java diff --git a/Cargo.lock b/Cargo.lock index 07e3b32..4a87adc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,13 +1,26 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +[[package]] +name = "addr2line" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "gimli 0.22.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "adler" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "adler32" -version = "1.0.4" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "aho-corasick" -version = "0.7.10" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -18,7 +31,7 @@ name = "android_liblog-sys" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.70 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.77 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -35,7 +48,7 @@ name = "ansi_term" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -43,7 +56,7 @@ name = "ansi_term" version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -60,39 +73,39 @@ dependencies = [ "odds 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "arrayvec" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "nodrop 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "arrayvec" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "ascii" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "atty" version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hermit-abi 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.70 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "hermit-abi 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.77 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "autocfg" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "backtrace" +version = "0.3.51" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "addr2line 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.77 (registry+https://github.com/rust-lang/crates.io-index)", + "miniz_oxide 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "object 0.20.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-demangle 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "base-x" version = "0.2.6" @@ -100,16 +113,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "base64" -version = "0.11.0" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "bincode" -version = "1.2.1" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.110 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.116 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -187,12 +200,12 @@ dependencies = [ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "regex-automata 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.110 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.116 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "bumpalo" -version = "3.3.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -205,9 +218,14 @@ name = "byteorder" version = "1.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "bytes" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "bytesize" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -220,7 +238,7 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.54" +version = "1.0.60" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -235,17 +253,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "chrono" -version = "0.4.11" +version = "0.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "num-integer 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "time 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.77 (registry+https://github.com/rust-lang/crates.io-index)", + "num-integer 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", + "time 0.1.44 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "clap" -version = "2.33.1" +version = "2.33.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -253,7 +273,7 @@ dependencies = [ "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-width 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", "vec_map 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", "yaml-rust 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -265,19 +285,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "combine" -version = "3.8.1" +version = "4.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "ascii 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)", - "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "pin-project-lite 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -286,9 +304,14 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "const_fn" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "constant_time_eq" version = "0.1.5" @@ -304,37 +327,47 @@ dependencies = [ [[package]] name = "criterion" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", "cast 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "clap 2.33.1 (registry+https://github.com/rust-lang/crates.io-index)", - "criterion-plot 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "clap 2.33.3 (registry+https://github.com/rust-lang/crates.io-index)", + "criterion-plot 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "csv 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "itertools 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "oorandom 11.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "plotters 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", - "rayon 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.3.7 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.110 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.110 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.53 (registry+https://github.com/rust-lang/crates.io-index)", - "tinytemplate 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", + "oorandom 11.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "plotters 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)", + "rayon 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.3.9 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.116 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_cbor 0.11.1 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.116 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.57 (registry+https://github.com/rust-lang/crates.io-index)", + "tinytemplate 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "walkdir 2.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "criterion-plot" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cast 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "itertools 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "crossbeam-channel" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "crossbeam-deque" version = "0.7.3" @@ -350,30 +383,21 @@ name = "crossbeam-epoch" version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "memoffset 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", + "memoffset 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", "scopeguard 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "crossbeam-queue" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "crossbeam-utils" version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -385,9 +409,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bstr 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", "csv-core 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", - "ryu 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.110 (registry+https://github.com/rust-lang/crates.io-index)", + "itoa 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "ryu 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.116 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -416,23 +440,22 @@ dependencies = [ ] [[package]] -name = "dirs" -version = "2.0.2" +name = "dirs-next" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "dirs-sys 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "dirs-sys-next 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] -name = "dirs-sys" -version = "0.3.4" +name = "dirs-sys-next" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.70 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_users 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.77 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_users 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -442,7 +465,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "either" -version = "1.5.3" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -462,17 +485,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", "humantime 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.3.7 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.3.9 (registry+https://github.com/rust-lang/crates.io-index)", "termcolor 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "error-chain" -version = "0.12.2" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "version_check 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace 0.3.51 (registry+https://github.com/rust-lang/crates.io-index)", + "version_check 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -487,8 +511,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", "crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.70 (registry+https://github.com/rust-lang/crates.io-index)", - "miniz_oxide 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.77 (registry+https://github.com/rust-lang/crates.io-index)", + "miniz_oxide 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -496,10 +520,10 @@ name = "flexi_logger" version = "0.14.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "chrono 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "chrono 0.4.18 (registry+https://github.com/rust-lang/crates.io-index)", "glob 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.3.7 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.3.9 (registry+https://github.com/rust-lang/crates.io-index)", "yansi 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -522,7 +546,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "fuzzy-matcher" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "thread_local 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -533,8 +557,8 @@ name = "gdbstub" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -556,14 +580,19 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.1.14" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.70 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.77 (registry+https://github.com/rust-lang/crates.io-index)", "wasi 0.9.0+wasi-snapshot-preview1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "gimli" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "glob" version = "0.3.0" @@ -574,17 +603,22 @@ name = "goblin" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", "plain 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "scroll 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "half" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "hermit-abi" -version = "0.1.13" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.70 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.77 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -592,16 +626,16 @@ name = "hex-literal" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hex-literal-impl 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro-hack 0.5.15 (registry+https://github.com/rust-lang/crates.io-index)", + "hex-literal-impl 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-hack 0.5.18 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "hex-literal-impl" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro-hack 0.5.15 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-hack 0.5.18 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -623,12 +657,13 @@ dependencies = [ [[package]] name = "instant" -version = "0.1.4" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "js-sys 0.3.39 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", - "web-sys 0.3.39 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.45 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", + "web-sys 0.3.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -641,24 +676,24 @@ name = "itertools" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "either 1.6.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "itoa" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "jni" -version = "0.16.0" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cesu8 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "combine 3.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "error-chain 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", + "combine 4.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "error-chain 0.12.4 (registry+https://github.com/rust-lang/crates.io-index)", "jni-sys 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", "walkdir 2.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -669,10 +704,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "js-sys" -version = "0.3.39" +version = "0.3.45" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "wasm-bindgen 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -696,19 +731,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "lexical-core" -version = "0.6.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "arrayvec 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", + "arrayvec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "ryu 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "static_assertions 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "ryu 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "static_assertions 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "libc" -version = "0.2.70" +version = "0.2.77" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -716,9 +751,9 @@ name = "libretro-backend" version = "0.2.1" source = "git+https://github.com/michelhe/libretro-backend.git?branch=rustboyadvance#cb525222a9151d10fe61fba95369ea6325dbc318" dependencies = [ - "libc 0.2.70 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.77 (registry+https://github.com/rust-lang/crates.io-index)", "libretro-sys 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -726,7 +761,7 @@ name = "libretro-sys" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.70 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.77 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -739,12 +774,12 @@ name = "log" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "log" -version = "0.4.8" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", @@ -767,10 +802,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "memoffset" -version = "0.5.4" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -783,11 +818,11 @@ name = "minifb" version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cc 1.0.54 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.60 (registry+https://github.com/rust-lang/crates.io-index)", "gdi32-sys 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "orbclient 0.3.23 (registry+https://github.com/rust-lang/crates.io-index)", - "time 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)", + "time 0.1.44 (registry+https://github.com/rust-lang/crates.io-index)", "user32-sys 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "x11-dl 2.14.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -795,22 +830,30 @@ dependencies = [ [[package]] name = "miniz_oxide" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "adler32 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "adler32 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "miniz_oxide" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "adler 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "nix" -version = "0.17.0" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "cc 1.0.54 (registry+https://github.com/rust-lang/crates.io-index)", + "cc 1.0.60 (registry+https://github.com/rust-lang/crates.io-index)", "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.70 (registry+https://github.com/rust-lang/crates.io-index)", - "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.77 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -820,12 +863,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "nom" -version = "5.1.1" +version = "5.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "lexical-core 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "lexical-core 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)", "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "version_check 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "version_check 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -833,9 +876,9 @@ name = "num" version = "0.1.42" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "num-integer 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", - "num-iter 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "num-integer 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)", + "num-iter 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -845,10 +888,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "num-bigint 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", "num-complex 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", - "num-integer 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", - "num-iter 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", + "num-integer 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)", + "num-iter 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", "num-rational 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -856,9 +899,9 @@ name = "num-bigint" version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "num-integer 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "num-integer 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -866,27 +909,27 @@ name = "num-complex" version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "num-integer" -version = "0.1.42" +version = "0.1.43" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "num-iter" -version = "0.1.40" +version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "num-integer 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "num-integer 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -894,10 +937,10 @@ name = "num-rational" version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "num-bigint 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "num-integer 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "num-integer 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -905,15 +948,15 @@ name = "num-traits" version = "0.1.43" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "num-traits" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -921,10 +964,15 @@ name = "num_cpus" version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hermit-abi 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.70 (registry+https://github.com/rust-lang/crates.io-index)", + "hermit-abi 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.77 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "object" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "odds" version = "0.2.26" @@ -932,7 +980,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "oorandom" -version = "11.1.1" +version = "11.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -945,13 +993,18 @@ name = "orbclient" version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.57 (registry+https://github.com/rust-lang/crates.io-index)", "sdl2 0.31.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "pin-project-lite" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "pkg-config" -version = "0.3.17" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -961,23 +1014,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "plotters" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "js-sys 0.3.39 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", - "web-sys 0.3.39 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.45 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", + "web-sys 0.3.45 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "podio" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "proc-macro-hack" -version = "0.5.15" +version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -990,10 +1038,10 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.13" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-xid 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1016,10 +1064,10 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.6" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.23 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1027,7 +1075,7 @@ name = "rand" version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.70 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.77 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1037,10 +1085,10 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.70 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.77 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1058,21 +1106,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "rayon" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ + "autocfg 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-deque 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)", - "rayon-core 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "either 1.6.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rayon-core 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "rayon-core" -version = "1.7.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ + "crossbeam-channel 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-deque 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-queue 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "num_cpus 1.13.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1088,27 +1137,27 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.1.56" +version = "0.1.57" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "redox_users" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", - "rust-argon2 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "getrandom 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.57 (registry+https://github.com/rust-lang/crates.io-index)", + "rust-argon2 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "regex" -version = "1.3.7" +version = "1.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "aho-corasick 0.7.10 (registry+https://github.com/rust-lang/crates.io-index)", + "aho-corasick 0.7.13 (registry+https://github.com/rust-lang/crates.io-index)", "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "regex-syntax 0.6.17 (registry+https://github.com/rust-lang/crates.io-index)", + "regex-syntax 0.6.18 (registry+https://github.com/rust-lang/crates.io-index)", "thread_local 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1122,20 +1171,20 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.6.17" +version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "ringbuf" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "rust-argon2" -version = "0.7.0" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "base64 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "base64 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", "blake2b_simd 0.5.10 (registry+https://github.com/rust-lang/crates.io-index)", "constant_time_eq 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1147,38 +1196,38 @@ version = "0.1.0" dependencies = [ "ansi_term 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)", "arrayvec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "bincode 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bincode 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "bit 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "bit-set 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", "bit_reverse 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", "bitfield 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "bytesize 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "chrono 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "bytesize 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "chrono 0.4.18 (registry+https://github.com/rust-lang/crates.io-index)", "colored 1.9.3 (registry+https://github.com/rust-lang/crates.io-index)", - "criterion 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "criterion 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "debug_stub_derive 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "enum-primitive-derive 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "fuzzy-matcher 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "fuzzy-matcher 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", "gdbstub 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "goblin 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "hex-literal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "hexdump 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "instant 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "instant 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", "memmem 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "nom 5.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "nom 5.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "num 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "ringbuf 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rustyline 6.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.110 (registry+https://github.com/rust-lang/crates.io-index)", - "sha2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", - "time 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)", - "yaml-rust 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", - "zip 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)", + "ringbuf 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "rustyline 6.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.116 (registry+https://github.com/rust-lang/crates.io-index)", + "sha2 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", + "time 0.2.22 (registry+https://github.com/rust-lang/crates.io-index)", + "yaml-rust 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "zip 0.5.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1187,8 +1236,8 @@ version = "0.1.0" dependencies = [ "android_log 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "env_logger 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "jni 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "jni 0.17.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", "rustboyadvance-core 0.1.0", ] @@ -1197,10 +1246,10 @@ name = "rustboyadvance-libretro" version = "0.1.0" dependencies = [ "bit 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.70 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.77 (registry+https://github.com/rust-lang/crates.io-index)", "libretro-backend 0.2.1 (git+https://github.com/michelhe/libretro-backend.git?branch=rustboyadvance)", "libretro-sys 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", "rustboyadvance-core 0.1.0", "unsafe_unwrap 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1210,7 +1259,7 @@ name = "rustboyadvance-minifb" version = "0.1.0" dependencies = [ "bit 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "clap 2.33.1 (registry+https://github.com/rust-lang/crates.io-index)", + "clap 2.33.3 (registry+https://github.com/rust-lang/crates.io-index)", "minifb 0.11.2 (registry+https://github.com/rust-lang/crates.io-index)", "rustboyadvance-core 0.1.0", ] @@ -1220,11 +1269,11 @@ name = "rustboyadvance-sdl2" version = "0.1.0" dependencies = [ "bit 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "bytesize 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "clap 2.33.1 (registry+https://github.com/rust-lang/crates.io-index)", + "bytesize 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "clap 2.33.3 (registry+https://github.com/rust-lang/crates.io-index)", "flexi_logger 0.14.8 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "ringbuf 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "ringbuf 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "rustboyadvance-core 0.1.0", "sdl2 0.33.0 (registry+https://github.com/rust-lang/crates.io-index)", "spin_sleep 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1237,16 +1286,21 @@ version = "0.1.0" dependencies = [ "bit 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "console_error_panic_hook 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "js-sys 0.3.39 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.45 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", "rustboyadvance-core 0.1.0", - "wasm-bindgen 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-bindgen-console-logger 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-bindgen-test 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", - "web-sys 0.3.39 (registry+https://github.com/rust-lang/crates.io-index)", + "web-sys 0.3.45 (registry+https://github.com/rust-lang/crates.io-index)", "wee_alloc 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "rustc-demangle" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "rustc_version" version = "0.2.3" @@ -1257,25 +1311,25 @@ dependencies = [ [[package]] name = "rustyline" -version = "6.1.2" +version = "6.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "dirs 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.70 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "dirs-next 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.77 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "nix 0.17.0 (registry+https://github.com/rust-lang/crates.io-index)", + "nix 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)", "scopeguard 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-segmentation 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-width 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", "utf8parse 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "ryu" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1309,9 +1363,9 @@ name = "scroll_derive" version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.23 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.42 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1321,7 +1375,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.70 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.77 (registry+https://github.com/rust-lang/crates.io-index)", "num 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.3.23 (registry+https://github.com/rust-lang/crates.io-index)", "sdl2-sys 0.31.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1334,7 +1388,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.70 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.77 (registry+https://github.com/rust-lang/crates.io-index)", "sdl2-sys 0.33.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1352,7 +1406,7 @@ version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.70 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.77 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1370,30 +1424,39 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "serde" -version = "1.0.110" +version = "1.0.116" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde_derive 1.0.110 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.116 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "serde_cbor" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "half 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.116 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "serde_derive" -version = "1.0.110" +version = "1.0.116" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.23 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.42 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "serde_json" -version = "1.0.53" +version = "1.0.57" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", - "ryu 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.110 (registry+https://github.com/rust-lang/crates.io-index)", + "itoa 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "ryu 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.116 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1403,7 +1466,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "sha2" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1418,17 +1481,20 @@ version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "standback" -version = "0.2.8" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "version_check 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "static_assertions" -version = "0.3.4" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1441,7 +1507,7 @@ dependencies = [ "stdweb-derive 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", "stdweb-internal-macros 0.2.9 (registry+https://github.com/rust-lang/crates.io-index)", "stdweb-internal-runtime 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1449,11 +1515,11 @@ name = "stdweb-derive" version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.110 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.110 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.23 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.116 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.116 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.42 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1462,13 +1528,13 @@ version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "base-x 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.110 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.110 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.53 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.23 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.116 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.116 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.57 (registry+https://github.com/rust-lang/crates.io-index)", "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.42 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1493,12 +1559,12 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.22" +version = "1.0.42" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.23 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-xid 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1522,7 +1588,25 @@ name = "textwrap" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-width 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "thiserror" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "thiserror-impl 1.0.20 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 1.0.23 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.42 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1535,33 +1619,34 @@ dependencies = [ [[package]] name = "time" -version = "0.1.43" +version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.70 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.77 (registry+https://github.com/rust-lang/crates.io-index)", + "wasi 0.10.0+wasi-snapshot-preview1 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "time" -version = "0.2.16" +version = "0.2.22" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.70 (registry+https://github.com/rust-lang/crates.io-index)", - "standback 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "const_fn 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.77 (registry+https://github.com/rust-lang/crates.io-index)", + "standback 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", "stdweb 0.4.20 (registry+https://github.com/rust-lang/crates.io-index)", - "time-macros 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "version_check 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "time-macros 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "version_check 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "time-macros" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro-hack 0.5.15 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-hack 0.5.18 (registry+https://github.com/rust-lang/crates.io-index)", "time-macros-impl 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1570,20 +1655,20 @@ name = "time-macros-impl" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro-hack 0.5.15 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "standback 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-hack 0.5.18 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.23 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", + "standback 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.42 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tinytemplate" -version = "1.0.4" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.110 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.53 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.116 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.57 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1591,7 +1676,7 @@ name = "toml" version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.110 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.116 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1606,7 +1691,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "unicode-width" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1621,17 +1706,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "unicode-xid" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "unreachable" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "unsafe_unwrap" version = "0.1.0" @@ -1658,12 +1735,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "version_check" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "void" -version = "1.0.2" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1672,7 +1744,7 @@ version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "same-file 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", "winapi-util 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1681,27 +1753,32 @@ name = "wasi" version = "0.9.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "wasi" +version = "0.10.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "wasm-bindgen" -version = "0.2.62" +version = "0.2.68" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-macro 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-macro 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.62" +version = "0.2.68" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bumpalo 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bumpalo 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-shared 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.23 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.42 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-shared 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1709,8 +1786,8 @@ name = "wasm-bindgen-console-logger" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1720,35 +1797,35 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "js-sys 0.3.39 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", - "web-sys 0.3.39 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.45 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", + "web-sys 0.3.45 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.62" +version = "0.2.68" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "quote 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-macro-support 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-macro-support 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.62" +version = "0.2.68" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-backend 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen-shared 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.23 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.42 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-backend 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-shared 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.62" +version = "0.2.68" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1758,9 +1835,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "console_error_panic_hook 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "js-sys 0.3.39 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.45 (registry+https://github.com/rust-lang/crates.io-index)", "scoped-tls 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-bindgen-futures 0.3.27 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-bindgen-test-macro 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1776,11 +1853,11 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.39" +version = "0.3.45" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "js-sys 0.3.39 (registry+https://github.com/rust-lang/crates.io-index)", - "wasm-bindgen 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", + "js-sys 0.3.45 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1789,9 +1866,9 @@ version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.70 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.77 (registry+https://github.com/rust-lang/crates.io-index)", "memory_units 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1801,7 +1878,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "winapi" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1823,7 +1900,7 @@ name = "winapi-util" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1845,8 +1922,8 @@ version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.70 (registry+https://github.com/rust-lang/crates.io-index)", - "pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.77 (registry+https://github.com/rust-lang/crates.io-index)", + "pkg-config 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1856,7 +1933,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "yaml-rust" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "linked-hash-map 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1869,32 +1946,34 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "zip" -version = "0.5.5" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ + "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "flate2 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", - "podio 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "time 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)", + "thiserror 1.0.20 (registry+https://github.com/rust-lang/crates.io-index)", + "time 0.1.44 (registry+https://github.com/rust-lang/crates.io-index)", ] [metadata] -"checksum adler32 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5d2e7343e7fc9de883d1b0341e0b13970f764c14101234857d2ddafa1cb1cac2" -"checksum aho-corasick 0.7.10 (registry+https://github.com/rust-lang/crates.io-index)" = "8716408b8bc624ed7f65d223ddb9ac2d044c0547b6fa4b0d554f3a9540496ada" +"checksum addr2line 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1b6a2d3371669ab3ca9797670853d61402b03d0b4b9ebf33d677dfa720203072" +"checksum adler 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ee2a4ec343196209d6594e19543ae87a39f96d5534d7174822a3ad825dd6ed7e" +"checksum adler32 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aae1277d39aeec15cb388266ecc24b11c80469deae6067e17a1a7aa9e5c1f234" +"checksum aho-corasick 0.7.13 (registry+https://github.com/rust-lang/crates.io-index)" = "043164d8ba5c4c3035fec9bbee8647c0261d788f3474306f93bb65901cae0e86" "checksum android_liblog-sys 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "aaf82c031178ca72b38595a54d16df8a257df9deea7d97a8992870e5c6a738e7" "checksum android_log 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cc00e0d3a060cce3fa338f9644ce9a93901c79f5405330891aeca69c9957009a" "checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" "checksum ansi_term 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" "checksum arrayref 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" "checksum arrayvec 0.3.25 (registry+https://github.com/rust-lang/crates.io-index)" = "06f59fe10306bb78facd90d28c2038ad23ffaaefa85bac43c8a434cde383334f" -"checksum arrayvec 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)" = "cd9fd44efafa8690358b7408d253adf110036b88f55672a933f01d616ad9b1b9" "checksum arrayvec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cff77d8686867eceff3105329d4698d96c2391c176d5d03adc90c7389162b5b8" -"checksum ascii 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)" = "eab1c04a571841102f5345a8fc0f6bb3d31c315dec879b5c6e42e40ce7ffa34e" "checksum atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -"checksum autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d" +"checksum autocfg 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" +"checksum backtrace 0.3.51 (registry+https://github.com/rust-lang/crates.io-index)" = "ec1931848a574faa8f7c71a12ea00453ff5effbb5f51afe7f77d7a48cace6ac1" "checksum base-x 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "1b20b618342cf9891c292c4f5ac2cde7287cc5c87e87e9c769d617793607dec1" -"checksum base64 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b41b7ea54a0c9d92199de89e20e58d49f02f8e699814ef3fdf266f6f748d15c7" -"checksum bincode 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5753e2a71534719bf3f4e57006c3a4f0d2c672a4b676eec84161f763eca87dbf" +"checksum base64 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" +"checksum bincode 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f30d3a39baa26f9651f17b375061f3233dde33424a8b72b0dbe93a68a0bc896d" "checksum bit 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2b645c5c09a7d4035949cfce1a915785aaad6f17800c35fda8a8c311c491f284" "checksum bit-set 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6e11e16035ea35e4e5997b393eacbf6f63983188f7a2ad25bfb13465f5ad59de" "checksum bit-vec 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5f0dc55f2d8a1a85650ac47858bb001b4c0dd73d79e3c455a842925e68d29cd3" @@ -1906,124 +1985,131 @@ dependencies = [ "checksum block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" "checksum block-padding 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" "checksum bstr 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)" = "31accafdb70df7871592c058eca3985b71104e15ac32f64706022c58867da931" -"checksum bumpalo 3.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5356f1d23ee24a1f785a56d1d1a5f0fd5b0f6a0c0fb2412ce11da71649ab78f6" +"checksum bumpalo 3.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2e8c087f005730276d1096a652e92a8bacee2e2472bcc9715a74d2bec38b5820" "checksum byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" "checksum byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de" -"checksum bytesize 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "716960a18f978640f25101b5cbf1c6f6b0d3192fab36a2d98ca96f0ecbe41010" +"checksum bytes 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0e4cec68f03f32e44924783795810fa50a7035d8c8ebe78580ad7e6c703fba38" +"checksum bytesize 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "81a18687293a1546b67c246452202bbbf143d239cb43494cc163da14979082da" "checksum cast 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4b9434b9a5aa1450faa3f9cb14ea0e8c53bb5d2b3c1bfd1ab4fc03e9f33fbfb0" -"checksum cc 1.0.54 (registry+https://github.com/rust-lang/crates.io-index)" = "7bbb73db36c1246e9034e307d0fba23f9a2e251faa47ade70c1bd252220c8311" +"checksum cc 1.0.60 (registry+https://github.com/rust-lang/crates.io-index)" = "ef611cc68ff783f18535d77ddd080185275713d852c4f5cbb6122c462a7a825c" "checksum cesu8 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" "checksum cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" -"checksum chrono 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)" = "80094f509cf8b5ae86a4966a39b3ff66cd7e2a3e594accec3743ff3fabeab5b2" -"checksum clap 2.33.1 (registry+https://github.com/rust-lang/crates.io-index)" = "bdfa80d47f954d53a35a64987ca1422f495b8d6483c0fe9f7117b36c2a792129" +"checksum chrono 0.4.18 (registry+https://github.com/rust-lang/crates.io-index)" = "d021fddb7bd3e734370acfa4a83f34095571d8570c039f1420d77540f68d5772" +"checksum clap 2.33.3 (registry+https://github.com/rust-lang/crates.io-index)" = "37e58ac78573c40708d45522f0d80fa2f01cc4f9b4e2bf749807255454312002" "checksum colored 1.9.3 (registry+https://github.com/rust-lang/crates.io-index)" = "f4ffc801dacf156c5854b9df4f425a626539c3a6ef7893cc0c5084a23f0b6c59" -"checksum combine 3.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "da3da6baa321ec19e1cc41d31bf599f00c783d0517095cdaf0332e3fe8d20680" +"checksum combine 4.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2809f67365382d65fd2b6d9c22577231b954ed27400efeafbe687bda75abcc0b" "checksum console_error_panic_hook 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "b8d976903543e0c48546a91908f21588a680a8c8f984df9a5d69feccb2b2a211" +"checksum const_fn 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ce90df4c658c62f12d78f7508cf92f9173e5184a539c10bfe54a3107b3ffd0f2" "checksum constant_time_eq 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" "checksum crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ba125de2af0df55319f41944744ad91c71113bf74a4646efff39afe1f6842db1" -"checksum criterion 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "63f696897c88b57f4ffe3c69d8e1a0613c7d0e6c4833363c8560fbde9c47b966" -"checksum criterion-plot 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ddeaf7989f00f2e1d871a26a110f3ed713632feac17f65f03ca938c542618b60" +"checksum criterion 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "70daa7ceec6cf143990669a04c7df13391d55fb27bd4079d252fca774ba244d8" +"checksum criterion-plot 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e022feadec601fba1649cfa83586381a4ad31c6bf3a9ab7d408118b05dd9889d" +"checksum crossbeam-channel 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "b153fe7cbef478c567df0f972e02e6d736db11affe43dfc9c56a9374d1adfb87" "checksum crossbeam-deque 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "9f02af974daeee82218205558e51ec8768b48cf524bd01d550abe5573a608285" "checksum crossbeam-epoch 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "058ed274caafc1f60c4997b5fc07bf7dc7cca454af7c6e81edffe5f33f70dace" -"checksum crossbeam-queue 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c695eeca1e7173472a32221542ae469b3e9aac3a4fc81f7696bcad82029493db" "checksum crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8" "checksum csv 1.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "00affe7f6ab566df61b4be3ce8cf16bc2576bca0963ceb0955e45d514bf9a279" "checksum csv-core 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "2b2466559f260f48ad25fe6317b3c8dac77b5bdb5763ac7d9d6103530663bc90" "checksum debug_stub_derive 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "496b7f8a2f853313c3ca370641d7ff3e42c32974fdccda8f0684599ed0a3ff6b" "checksum digest 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" -"checksum dirs 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "13aea89a5c93364a98e9b37b2fa237effbb694d5cfe01c5b70941f7eb087d5e3" -"checksum dirs-sys 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "afa0b23de8fd801745c471deffa6e12d248f962c9fd4b4c33787b055599bde7b" +"checksum dirs-next 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1cbcf9241d9e8d106295bd496bbe2e9cffd5fa098f2a8c9e2bbcbf09773c11a8" +"checksum dirs-sys-next 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9c60f7b8a8953926148223260454befb50c751d3c50e1c178c4fd1ace4083c9a" "checksum discard 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "212d0f5754cb6769937f4501cc0e67f4f4483c8d2c3e1e922ee9edbe4ab4c7c0" -"checksum either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "bb1f6b1ce1c140482ea30ddd3335fc0024ac7ee112895426e0a629a6c20adfe3" +"checksum either 1.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" "checksum enum-primitive-derive 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e2b90e520ec62c1864c8c78d637acbfe8baf5f63240f2fb8165b8325c07812dd" "checksum env_logger 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36" -"checksum error-chain 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d371106cc88ffdfb1eabd7111e432da544f16f3e2d7bf1dfe8bf575f1df045cd" +"checksum error-chain 0.12.4 (registry+https://github.com/rust-lang/crates.io-index)" = "2d2f06b9cac1506ece98fe3231e3cc9c4410ec3d5b1f24ae1c8946f0742cdefc" "checksum fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" "checksum flate2 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)" = "2cfff41391129e0a856d6d822600b8d71179d46879e310417eb9c762eb178b42" "checksum flexi_logger 0.14.8 (registry+https://github.com/rust-lang/crates.io-index)" = "515fb7f6541dafe542c87c12a7ab6a52190cccb6c348b5951ef62d9978189ae8" "checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" "checksum futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)" = "1b980f2816d6ee8673b6517b52cb0e808a180efc92e5c19d02cdda79066703ef" -"checksum fuzzy-matcher 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "75a03d6d8629fcd151ece9d3a7f59a87fc38a620ab0290bf2888c2ad73821170" +"checksum fuzzy-matcher 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "cda28c4acb13182d935e0ab6bc12329d1d22134d69801d0836d1ae4b47054f2a" "checksum gdbstub 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0cdb70c5cea5faa069cd8a24444b8dee8635c9da6c9d1257008e980ec62bcf14" "checksum gdi32-sys 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8e3eb92c1107527888f86b6ebb0b7f82794777dbf172a932998660a0a2e26c11" "checksum generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c68f0274ae0e023facc3c97b2e00f076be70e254bc851d972503b328db79b2ec" -"checksum getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "7abc8dd8451921606d809ba32e95b6111925cd2906060d2dcc29c070220503eb" +"checksum getrandom 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "fc587bc0ec293155d5bfa6b9891ec18a1e330c234f896ea47fbada4cadbe47e6" +"checksum gimli 0.22.0 (registry+https://github.com/rust-lang/crates.io-index)" = "aaf91faf136cb47367fa430cd46e37a788775e7fa104f8b4bcb3861dc389b724" "checksum glob 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" "checksum goblin 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d20fd25aa456527ce4f544271ae4fea65d2eda4a6561ea56f39fb3ee4f7e3884" -"checksum hermit-abi 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "91780f809e750b0a89f5544be56617ff6b1227ee485bcb06ebe10cdf89bd3b71" +"checksum half 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d36fab90f82edc3c747f9d438e06cf0a491055896f2a279638bb5beed6c40177" +"checksum hermit-abi 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "4c30f6d0bc6b00693347368a67d41b58f2fb851215ff1da49e90fe2c5c667151" "checksum hex-literal 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "961de220ec9a91af2e1e5bd80d02109155695e516771762381ef8581317066e0" -"checksum hex-literal-impl 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9d4c5c844e2fee0bf673d54c2c177f1713b3d2af2ff6e666b49cb7572e6cf42d" +"checksum hex-literal-impl 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "853f769599eb31de176303197b7ba4973299c38c7a7604a6bc88c3eef05b9b46" "checksum hexdump 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "850f3f2c33d20c0f96c4485e087dd580ff041d720988ebf4c84a42acf739262b" "checksum humantime 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f" -"checksum instant 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "7777a24a1ce5de49fcdde84ec46efa487c3af49d5b6e6e0a50367cc5c1096182" +"checksum instant 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "63312a18f7ea8760cdd0a7c5aac1a619752a246b833545e3e36d1f81f7cd9e66" "checksum itertools 0.4.19 (registry+https://github.com/rust-lang/crates.io-index)" = "c4a9b56eb56058f43dc66e58f40a214b2ccbc9f3df51861b63d51dec7b65bc3f" "checksum itertools 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "284f18f85651fe11e8a991b2adb42cb078325c996ed026d994719efcfca1d54b" -"checksum itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "b8b7a7c0c47db5545ed3fef7468ee7bb5b74691498139e4b3f6a20685dc6dd8e" -"checksum jni 0.16.0 (registry+https://github.com/rust-lang/crates.io-index)" = "22bbdc25b49340bc4fc3d9c96dd84d878c4beeca35e3651efa53db51a68d7d4d" +"checksum itoa 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "dc6f3ad7b9d11a0c00842ff8de1b60ee58661048eb8049ed33c73594f359d7e6" +"checksum jni 0.17.0 (registry+https://github.com/rust-lang/crates.io-index)" = "36bcc950632e48b86da402c5c077590583da5ac0d480103611d5374e7c967a3c" "checksum jni-sys 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" -"checksum js-sys 0.3.39 (registry+https://github.com/rust-lang/crates.io-index)" = "fa5a448de267e7358beaf4a5d849518fe9a0c13fce7afd44b06e68550e5562a7" +"checksum js-sys 0.3.45 (registry+https://github.com/rust-lang/crates.io-index)" = "ca059e81d9486668f12d455a4ea6daa600bd408134cd17e3d3fb5a32d1f016f8" "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" "checksum lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "76f033c7ad61445c5b347c7382dd1237847eb1bce590fe50365dcb33d546be73" "checksum lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" -"checksum lexical-core 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d7043aa5c05dd34fb73b47acb8c3708eac428de4545ea3682ed2f11293ebd890" -"checksum libc 0.2.70 (registry+https://github.com/rust-lang/crates.io-index)" = "3baa92041a6fec78c687fa0cc2b3fae8884f743d672cf551bed1d6dac6988d0f" +"checksum lexical-core 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)" = "db65c6da02e61f55dae90a0ae427b2a5f6b3e8db09f58d10efab23af92592616" +"checksum libc 0.2.77 (registry+https://github.com/rust-lang/crates.io-index)" = "f2f96b10ec2560088a8e76961b00d47107b3a625fecb76dedb29ee7ccbf98235" "checksum libretro-backend 0.2.1 (git+https://github.com/michelhe/libretro-backend.git?branch=rustboyadvance)" = "" "checksum libretro-sys 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "207b060b02cecbcee6df3d0f5ed38691d5c4df1379dd1acd5c49c9b25d20b439" "checksum linked-hash-map 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8dd5a6d5999d9907cda8ed67bbd137d3af8085216c2ac62de5be860bd41f304a" "checksum log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b" -"checksum log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)" = "14b6052be84e6b71ab17edffc2eeabf5c2c3ae1fdb464aae35ac50c67a44e1f7" +"checksum log 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)" = "4fabed175da42fed1fa0746b0ea71f412aa9d35e76e95e59b192c64b9dc2bf8b" "checksum maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" "checksum memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3728d817d99e5ac407411fa471ff9800a778d88a24685968b36824eaf4bee400" "checksum memmem 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a64a92489e2744ce060c349162be1c5f33c6969234104dbd99ddb5feb08b8c15" -"checksum memoffset 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "b4fc2c02a7e374099d4ee95a193111f72d2110197fe200272371758f6c3643d8" +"checksum memoffset 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "043175f069eda7b85febe4a74abbaeff828d9f8b448515d3151a14a3542811aa" "checksum memory_units 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8452105ba047068f40ff7093dd1d9da90898e63dd61736462e9cdda6a90ad3c3" "checksum minifb 0.11.2 (registry+https://github.com/rust-lang/crates.io-index)" = "85c2cedede43aad485232acf318a3e191ee5a3c2250ca8a3556b849a48e8b901" -"checksum miniz_oxide 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "aa679ff6578b1cddee93d7e82e263b94a575e0bfced07284eb0c037c1d2416a5" -"checksum nix 0.17.0 (registry+https://github.com/rust-lang/crates.io-index)" = "50e4785f2c3b7589a0d0c1dd60285e1188adac4006e8abd6dd578e1567027363" +"checksum miniz_oxide 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "791daaae1ed6889560f8c4359194f56648355540573244a5448a83ba1ecc7435" +"checksum miniz_oxide 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c60c0dfe32c10b43a144bad8fc83538c52f58302c92300ea7ec7bf7b38d5a7b9" +"checksum nix 0.18.0 (registry+https://github.com/rust-lang/crates.io-index)" = "83450fe6a6142ddd95fb064b746083fc4ef1705fe81f64a64e1d4b39f54a1055" "checksum nodrop 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" -"checksum nom 5.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b471253da97532da4b61552249c521e01e736071f71c1a4f7ebbfbf0a06aad6" +"checksum nom 5.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ffb4262d26ed83a1c0a33a38fe2bb15797329c85770da05e6b828ddb782627af" "checksum num 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "4703ad64153382334aa8db57c637364c322d3372e097840c72000dabdcf6156e" "checksum num 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b8536030f9fea7127f841b45bb6243b27255787fb4eb83958aa1ef9d2fdc0c36" "checksum num-bigint 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304" "checksum num-complex 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "b6b19411a9719e753aff12e5187b74d60d3dc449ec3f4dc21e3989c3f554bc95" -"checksum num-integer 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "3f6ea62e9d81a77cd3ee9a2a5b9b609447857f3d358704331e4ef39eb247fcba" -"checksum num-iter 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "dfb0800a0291891dd9f4fe7bd9c19384f98f7fbe0cd0f39a2c6b88b9868bbc00" +"checksum num-integer 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)" = "8d59457e662d541ba17869cf51cf177c0b5f0cbf476c66bdc90bf1edac4f875b" +"checksum num-iter 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e6b7c748f995c4c29c5f5ae0248536e04a5739927c74ec0fa564805094b9f" "checksum num-rational 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5c000134b5dbf44adc5cb772486d335293351644b801551abe8f75c84cfa4aef" "checksum num-traits 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)" = "92e5113e9fd4cc14ded8e499429f396a20f98c772a47cc8622a736e1ec843c31" -"checksum num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "c62be47e61d1842b9170f0fdeec8eba98e60e90e5446449a0545e5152acd7096" +"checksum num-traits 0.2.12 (registry+https://github.com/rust-lang/crates.io-index)" = "ac267bcc07f48ee5f8935ab0d24f316fb722d7a1292e2913f0cc196b29ffd611" "checksum num_cpus 1.13.0 (registry+https://github.com/rust-lang/crates.io-index)" = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" +"checksum object 0.20.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1ab52be62400ca80aa00285d25253d7f7c437b7375c4de678f5405d3afe82ca5" "checksum odds 0.2.26 (registry+https://github.com/rust-lang/crates.io-index)" = "4eae0151b9dacf24fcc170d9995e511669a082856a91f958a2fe380bfab3fb22" -"checksum oorandom 11.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "94af325bc33c7f60191be4e2c984d48aaa21e2854f473b85398344b60c9b6358" +"checksum oorandom 11.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a170cebd8021a008ea92e4db85a72f80b35df514ec664b296fdcbb654eac0b2c" "checksum opaque-debug 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" "checksum orbclient 0.3.23 (registry+https://github.com/rust-lang/crates.io-index)" = "135507db238b8326a429e2c9f79cda29167a63223734f3c52956cc54e16f7d46" -"checksum pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)" = "05da548ad6865900e60eaba7f589cc0783590a92e940c26953ff81ddbab2d677" +"checksum pin-project-lite 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "4fe74897791e156a0cd8cce0db31b9b2198e67877316bf3086c3acd187f719f0" +"checksum pkg-config 0.3.18 (registry+https://github.com/rust-lang/crates.io-index)" = "d36492546b6af1463394d46f0c834346f31548646f6ba10849802c9c9a27ac33" "checksum plain 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" -"checksum plotters 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "f9b1d9ca091d370ea3a78d5619145d1b59426ab0c9eedbad2514a4cee08bf389" -"checksum podio 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "780fb4b6698bbf9cf2444ea5d22411cef2953f0824b98f33cf454ec5615645bd" -"checksum proc-macro-hack 0.5.15 (registry+https://github.com/rust-lang/crates.io-index)" = "0d659fe7c6d27f25e9d80a1a094c223f5246f6a6596453e09d7229bf42750b63" +"checksum plotters 0.2.15 (registry+https://github.com/rust-lang/crates.io-index)" = "0d1685fbe7beba33de0330629da9d955ac75bd54f33d7b79f9a895590124f6bb" +"checksum proc-macro-hack 0.5.18 (registry+https://github.com/rust-lang/crates.io-index)" = "99c605b9a0adc77b7211c6b1f722dcb613d68d66859a44f3d485a6da332b0598" "checksum proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)" = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" -"checksum proc-macro2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)" = "53f5ffe53a6b28e37c9c1ce74893477864d64f74778a93a4beb43c8fa167f639" +"checksum proc-macro2 1.0.23 (registry+https://github.com/rust-lang/crates.io-index)" = "51ef7cd2518ead700af67bf9d1a658d90b6037d77110fd9c0445429d0ba1c6c9" "checksum quick-error 1.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" "checksum quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a" "checksum quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)" = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1" -"checksum quote 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "54a21852a652ad6f610c9510194f398ff6f8692e334fd1145fed931f7fbe44ea" +"checksum quote 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "aa563d17ecb180e500da1cfd2b028310ac758de548efdd203e18f283af693f37" "checksum rand 0.3.23 (registry+https://github.com/rust-lang/crates.io-index)" = "64ac302d8f83c0c1974bf758f6b041c6c8ada916fbb44a609158ca8b064cc76c" "checksum rand 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293" "checksum rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" "checksum rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" -"checksum rayon 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "db6ce3297f9c85e16621bb8cca38a06779ffc31bb8184e1be4bed2be4678a098" -"checksum rayon-core 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "08a89b46efaf957e52b18062fb2f4660f8b8a4dde1807ca002690868ef2c85a9" +"checksum rayon 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cfd016f0c045ad38b5251be2c9c0ab806917f82da4d36b2a327e5166adad9270" +"checksum rayon-core 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e8c4fec834fb6e6d2dd5eece3c7b432a52f0ba887cf40e595190c4107edc08bf" "checksum rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" -"checksum redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)" = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84" -"checksum redox_users 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "09b23093265f8d200fa7b4c2c76297f47e681c655f6f1285a8780d6a022f7431" -"checksum regex 1.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "a6020f034922e3194c711b82a627453881bc4682166cabb07134a10c26ba7692" +"checksum redox_syscall 0.1.57 (registry+https://github.com/rust-lang/crates.io-index)" = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" +"checksum redox_users 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "de0737333e7a9502c789a36d7c7fa6092a49895d4faa31ca5df163857ded2e9d" +"checksum regex 1.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "9c3780fcf44b193bc4d09f36d2a3c87b251da4a046c87795a0d35f4f927ad8e6" "checksum regex-automata 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "ae1ded71d66a4a97f5e961fd0cb25a5f366a42a41570d16a763a69c092c26ae4" -"checksum regex-syntax 0.6.17 (registry+https://github.com/rust-lang/crates.io-index)" = "7fe5bd57d1d7414c6b5ed48563a2c855d995ff777729dcd91c369ec7fea395ae" -"checksum ringbuf 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7c2b29d87cfbdce39849012bb5020fff88b8f01f4f5b55846a0b6ef360774eae" -"checksum rust-argon2 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2bc8af4bda8e1ff4932523b94d3dd20ee30a87232323eda55903ffd71d2fb017" +"checksum regex-syntax 0.6.18 (registry+https://github.com/rust-lang/crates.io-index)" = "26412eb97c6b088a6997e05f69403a802a92d520de2f8e63c2b65f9e0f47c4e8" +"checksum ringbuf 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "605dc50025dcaaeb8ce2b6b3583432b446c80c90ecd8463569dba8a040e87886" +"checksum rust-argon2 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9dab61250775933275e84053ac235621dfb739556d5c54a2f2e9313b7cf43a19" +"checksum rustc-demangle 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "4c691c0e608126e00913e33f0ccf3727d5fc84573623b8d65b2df340b5201783" "checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" -"checksum rustyline 6.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1cd20b28d972040c627e209eb29f19c24a71a19d661cc5a220089176e20ee202" -"checksum ryu 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "ed3d612bc64430efeb3f7ee6ef26d590dce0c43249217bddc62112540c7941e1" +"checksum rustyline 6.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6f0d5e7b0219a3eadd5439498525d4765c59b7c993ef0c12244865cd2d988413" +"checksum ryu 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" "checksum same-file 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" "checksum scoped-tls 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2" "checksum scopeguard 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" @@ -2035,59 +2121,61 @@ dependencies = [ "checksum sdl2-sys 0.33.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c2e1deb61ff274d29fb985017d4611d4004b113676eaa9c06754194caf82094e" "checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" "checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" -"checksum serde 1.0.110 (registry+https://github.com/rust-lang/crates.io-index)" = "99e7b308464d16b56eba9964e4972a3eee817760ab60d88c3f86e1fecb08204c" -"checksum serde_derive 1.0.110 (registry+https://github.com/rust-lang/crates.io-index)" = "818fbf6bfa9a42d3bfcaca148547aa00c7b915bec71d1757aa2d44ca68771984" -"checksum serde_json 1.0.53 (registry+https://github.com/rust-lang/crates.io-index)" = "993948e75b189211a9b31a7528f950c6adc21f9720b6438ff80a7fa2f864cea2" +"checksum serde 1.0.116 (registry+https://github.com/rust-lang/crates.io-index)" = "96fe57af81d28386a513cbc6858332abc6117cfdb5999647c6444b8f43a370a5" +"checksum serde_cbor 0.11.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1e18acfa2f90e8b735b2836ab8d538de304cbb6729a7360729ea5a895d15a622" +"checksum serde_derive 1.0.116 (registry+https://github.com/rust-lang/crates.io-index)" = "f630a6370fd8e457873b4bd2ffdae75408bc291ba72be773772a4c2a065d9ae8" +"checksum serde_json 1.0.57 (registry+https://github.com/rust-lang/crates.io-index)" = "164eacbdb13512ec2745fb09d51fd5b22b0d65ed294a1dcf7285a360c80a675c" "checksum sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" -"checksum sha2 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "27044adfd2e1f077f649f59deb9490d3941d674002f7d062870a60ebe9bd47a0" +"checksum sha2 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a256f46ea78a0c0d9ff00077504903ac881a1dafdc20da66545699e7776b3e69" "checksum spin_sleep 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)" = "891836ef5f8a5b9678938d34d75391a3794267806482105ffcd363271980c10c" -"checksum standback 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "47e4b8c631c998468961a9ea159f064c5c8499b95b5e4a34b77849d45949d540" -"checksum static_assertions 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "7f3eb36b47e512f8f1c9e3d10c2c1965bc992bd9cdb024fa581e2194501c83d3" +"checksum standback 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "33a71ea1ea5f8747d1af1979bfb7e65c3a025a70609f04ceb78425bc5adad8e6" +"checksum static_assertions 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" "checksum stdweb 0.4.20 (registry+https://github.com/rust-lang/crates.io-index)" = "d022496b16281348b52d0e30ae99e01a73d737b2f45d38fed4edf79f9325a1d5" "checksum stdweb-derive 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c87a60a40fccc84bef0652345bbbbbe20a605bf5d0ce81719fc476f5c03b50ef" "checksum stdweb-internal-macros 0.2.9 (registry+https://github.com/rust-lang/crates.io-index)" = "58fa5ff6ad0d98d1ffa8cb115892b6e69d67799f6763e162a1c9db421dc22e11" "checksum stdweb-internal-runtime 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "213701ba3370744dcd1a12960caa4843b3d68b4d1c0a5d575e0d65b2ee9d16c0" "checksum strsim 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" "checksum syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d3b891b9015c88c576343b9b3e41c2c11a51c219ef067b264bd9c8aa9b441dad" -"checksum syn 1.0.22 (registry+https://github.com/rust-lang/crates.io-index)" = "1425de3c33b0941002740a420b1a906a350b88d08b82b2c8a01035a3f9447bac" +"checksum syn 1.0.42 (registry+https://github.com/rust-lang/crates.io-index)" = "9c51d92969d209b54a98397e1b91c8ae82d8c87a7bb87df0b29aa2ad81454228" "checksum synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a393066ed9010ebaed60b9eafa373d4b1baac186dd7e008555b0f702b51945b6" "checksum termcolor 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bb6bfa289a4d7c5766392812c0a1f4c1ba45afa1ad47803c11e1f407d846d75f" "checksum textwrap 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" +"checksum thiserror 1.0.20 (registry+https://github.com/rust-lang/crates.io-index)" = "7dfdd070ccd8ccb78f4ad66bf1982dc37f620ef696c6b5028fe2ed83dd3d0d08" +"checksum thiserror-impl 1.0.20 (registry+https://github.com/rust-lang/crates.io-index)" = "bd80fc12f73063ac132ac92aceea36734f04a1d93c1240c6944e23a3b8841793" "checksum thread_local 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d40c6d1b69745a6ec6fb1ca717914848da4b44ae29d9b3080cbee91d72a69b14" -"checksum time 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)" = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438" -"checksum time 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)" = "3a51cadc5b1eec673a685ff7c33192ff7b7603d0b75446fb354939ee615acb15" -"checksum time-macros 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9ae9b6e9f095bc105e183e3cd493d72579be3181ad4004fceb01adbe9eecab2d" +"checksum time 0.1.44 (registry+https://github.com/rust-lang/crates.io-index)" = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" +"checksum time 0.2.22 (registry+https://github.com/rust-lang/crates.io-index)" = "55b7151c9065e80917fbf285d9a5d1432f60db41d170ccafc749a136b41a93af" +"checksum time-macros 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "957e9c6e26f12cb6d0dd7fc776bb67a706312e7299aed74c8dd5b17ebb27e2f1" "checksum time-macros-impl 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e5c3be1edfad6027c69f5491cf4cb310d1a71ecd6af742788c6ff8bced86b8fa" -"checksum tinytemplate 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "45e4bc5ac99433e0dcb8b9f309dd271a165ae37dde129b9e0ce1bfdd8bfe4891" +"checksum tinytemplate 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6d3dc76004a03cec1c5932bca4cdc2e39aaa798e3f82363dd94f9adf6098c12f" "checksum toml 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ffc92d160b1eef40665be3a05630d003936a3bc7da7421277846c2613e92c71a" "checksum typenum 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "373c8a200f9e67a0c95e62a4f52fbf80c23b4381c05a17845531982fa99e6b33" "checksum unicode-segmentation 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e83e153d1053cbb5a118eeff7fd5be06ed99153f00dbcd8ae310c5fb2b22edc0" -"checksum unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "caaa9d531767d1ff2150b9332433f32a24622147e5ebb1f26409d5da67afd479" +"checksum unicode-width 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3" "checksum unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f860d7d29cf02cb2f3f359fd35991af3d30bac52c57d265a3c461074cb4dc" "checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" -"checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c" -"checksum unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" +"checksum unicode-xid 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" "checksum unsafe_unwrap 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1230ec65f13e0f9b28d789da20d2d419511893ea9dac2c1f4ef67b8b14e5da80" "checksum user32-sys 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e6b719983b952c04198829b51653c06af36f0e44c967fcc1a2bb397ceafbf80a" "checksum utf8parse 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "936e4b492acfd135421d8dca4b1aa80a7bfc26e702ef3af710e0752684df5372" "checksum vec_map 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" -"checksum version_check 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "078775d0255232fb988e6fccf26ddc9d1ac274299aaedcedce21c6f72cc533ce" -"checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" +"checksum version_check 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b5a972e5669d67ba988ce3dc826706fb0a8b01471c088cb0b6110b805cc36aed" "checksum walkdir 2.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "777182bc735b6424e1a57516d35ed72cb8019d85c8c9bf536dccb3445c1a2f7d" +"checksum wasi 0.10.0+wasi-snapshot-preview1 (registry+https://github.com/rust-lang/crates.io-index)" = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" "checksum wasi 0.9.0+wasi-snapshot-preview1 (registry+https://github.com/rust-lang/crates.io-index)" = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" -"checksum wasm-bindgen 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)" = "e3c7d40d09cdbf0f4895ae58cf57d92e1e57a9dd8ed2e8390514b54a47cc5551" -"checksum wasm-bindgen-backend 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)" = "c3972e137ebf830900db522d6c8fd74d1900dcfc733462e9a12e942b00b4ac94" +"checksum wasm-bindgen 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)" = "1ac64ead5ea5f05873d7c12b545865ca2b8d28adfc50a49b84770a3a97265d42" +"checksum wasm-bindgen-backend 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)" = "f22b422e2a757c35a73774860af8e112bff612ce6cb604224e8e47641a9e4f68" "checksum wasm-bindgen-console-logger 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7530a275e7faf7b5b83aabdf78244fb8d9a68a2ec4b26935a05ecc0c9b0185ed" "checksum wasm-bindgen-futures 0.3.27 (registry+https://github.com/rust-lang/crates.io-index)" = "83420b37346c311b9ed822af41ec2e82839bfe99867ec6c54e2da43b7538771c" -"checksum wasm-bindgen-macro 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)" = "2cd85aa2c579e8892442954685f0d801f9129de24fa2136b2c6a539c76b65776" -"checksum wasm-bindgen-macro-support 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)" = "8eb197bd3a47553334907ffd2f16507b4f4f01bbec3ac921a7719e0decdfe72a" -"checksum wasm-bindgen-shared 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)" = "a91c2916119c17a8e316507afaaa2dd94b47646048014bbdf6bef098c1bb58ad" +"checksum wasm-bindgen-macro 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)" = "6b13312a745c08c469f0b292dd2fcd6411dba5f7160f593da6ef69b64e407038" +"checksum wasm-bindgen-macro-support 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)" = "f249f06ef7ee334cc3b8ff031bfc11ec99d00f34d86da7498396dc1e3b1498fe" +"checksum wasm-bindgen-shared 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)" = "1d649a3145108d7d3fbcde896a468d1bd636791823c9921135218ad89be08307" "checksum wasm-bindgen-test 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)" = "a2d9693b63a742d481c7f80587e057920e568317b2806988c59cd71618bc26c1" "checksum wasm-bindgen-test-macro 0.2.50 (registry+https://github.com/rust-lang/crates.io-index)" = "0789dac148a8840bbcf9efe13905463b733fa96543bfbf263790535c11af7ba5" -"checksum web-sys 0.3.39 (registry+https://github.com/rust-lang/crates.io-index)" = "8bc359e5dd3b46cb9687a051d50a2fdd228e4ba7cf6fcf861a5365c3d671a642" +"checksum web-sys 0.3.45 (registry+https://github.com/rust-lang/crates.io-index)" = "4bf6ef87ad7ae8008e15a355ce696bed26012b7caa21605188cfd8214ab51e2d" "checksum wee_alloc 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "dbb3b5a6b2bb17cb6ad44a2e68a43e8d2722c997da10e928665c72ec6c0a0b8e" "checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" -"checksum winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "8093091eeb260906a183e6ae1abdba2ef5ef2257a21801128899c3fc699229c6" +"checksum winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" "checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" "checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" "checksum winapi-util 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" @@ -2095,6 +2183,6 @@ dependencies = [ "checksum winres 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "ff4fb510bbfe5b8992ff15f77a2e6fe6cf062878f0eda00c0f44963a807ca5dc" "checksum x11-dl 2.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "326c500cdc166fd7c70dd8c8a829cd5c0ce7be5a5d98c25817de2b9bdc67faf8" "checksum yaml-rust 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e66366e18dc58b46801afbf2ca7661a9f59cc8c5962c29892b6039b4f86fa992" -"checksum yaml-rust 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "65923dd1784f44da1d2c3dbbc5e822045628c590ba72123e1c73d3c230c4434d" +"checksum yaml-rust 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "39f0c922f1a334134dc2f7a8b67dc5d25f0735263feec974345ff706bcf20b0d" "checksum yansi 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9fc79f4a1e39857fc00c3f662cbf2651c771f00e9c15fe2abc341806bd46bd71" -"checksum zip 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "6df134e83b8f0f8153a094c7b0fd79dfebe437f1d76e7715afa18ed95ebe2fd7" +"checksum zip 0.5.8 (registry+https://github.com/rust-lang/crates.io-index)" = "543adf038106b64cfca4711c82c917d785e3540e04f7996554488f988ec43124" diff --git a/bindings/rustboyadvance-jni/Cargo.toml b/bindings/rustboyadvance-jni/Cargo.toml index a6848a4..8b8ca71 100644 --- a/bindings/rustboyadvance-jni/Cargo.toml +++ b/bindings/rustboyadvance-jni/Cargo.toml @@ -10,8 +10,8 @@ publish = false crate-type = ["staticlib", "cdylib"] [dependencies] -rustboyadvance-core = {path = "../../core/"} -jni = { version = "0.16", default-features = false } +rustboyadvance-core = {path = "../../core/", features = ["arm7tdmi_dispatch_table", "no_video_interface"]} +jni = "0.17.0" log = {version = "0.4.8", features = ["release_max_level_info", "max_level_debug"]} [target.'cfg(target_os="android")'.dependencies] diff --git a/bindings/rustboyadvance-jni/src/audio/connector.rs b/bindings/rustboyadvance-jni/src/audio/connector.rs new file mode 100644 index 0000000..3a6821a --- /dev/null +++ b/bindings/rustboyadvance-jni/src/audio/connector.rs @@ -0,0 +1,129 @@ +use jni::objects::{GlobalRef, JMethodID, JObject, JValue}; +use jni::signature::{JavaType, Primitive}; +use jni::sys::{jlong, jmethodID}; +use jni::JNIEnv; + +pub struct AudioJNIConnector { + pub audio_player_ref: GlobalRef, + pub audio_buffer_ref: GlobalRef, + + /// jmethodID is safe to pass between threads but the jni-sys crate marked them as !Send + /// TODO send patch to jni-sys + mid_audio_write: jlong, + mid_audio_play: jlong, + mid_audio_pause: jlong, + + pub sample_rate: i32, + pub sample_count: usize, +} + +impl AudioJNIConnector { + pub fn new(env: &JNIEnv, audio_player: JObject) -> AudioJNIConnector { + let audio_player_ref = env.new_global_ref(audio_player).unwrap(); + let audio_player_klass = env.get_object_class(audio_player_ref.as_obj()).unwrap(); + + let mid_audio_write = env + .get_method_id(audio_player_klass, "audioWrite", "([SII)I") + .expect("failed to get methodID for audioWrite") + .into_inner() as jlong; + let mid_audio_play = env + .get_method_id(audio_player_klass, "play", "()V") + .expect("failed to get methodID for audioPlay") + .into_inner() as jlong; + let mid_audio_pause = env + .get_method_id(audio_player_klass, "pause", "()V") + .expect("failed to get methodID for audioPause") + .into_inner() as jlong; + + let mid_get_sample_rate = env + .get_method_id(audio_player_klass, "getSampleRate", "()I") + .expect("failed to get methodID for getSampleRate"); + let mid_get_sample_count = env + .get_method_id(audio_player_klass, "getSampleCount", "()I") + .expect("failed to get methodID for getSampleCount"); + + let result = env + .call_method_unchecked( + audio_player_ref.as_obj(), + mid_get_sample_count, + JavaType::Primitive(Primitive::Int), + &[], + ) + .unwrap(); + + let sample_count = match result { + JValue::Int(sample_count) => sample_count as usize, + _ => panic!("bad return value"), + }; + + let result = env + .call_method_unchecked( + audio_player_ref.as_obj(), + mid_get_sample_rate, + JavaType::Primitive(Primitive::Int), + &[], + ) + .unwrap(); + let sample_rate = match result { + JValue::Int(sample_rate) => sample_rate as i32, + _ => panic!("bad return value"), + }; + + let audio_buffer = env + .new_short_array(sample_count as i32) + .expect("failed to create sound buffer"); + let audio_buffer_ref = env.new_global_ref(audio_buffer).unwrap(); + + // Don't need this ref anymore + drop(audio_player_klass); + + AudioJNIConnector { + audio_player_ref, + audio_buffer_ref, + mid_audio_pause, + mid_audio_play, + mid_audio_write, + sample_rate, + sample_count, + } + } + + #[inline] + pub fn pause(&self, env: &JNIEnv) { + // TODO handle errors + let _ = env.call_method_unchecked( + self.audio_player_ref.as_obj(), + JMethodID::from(self.mid_audio_pause as jmethodID), + JavaType::Primitive(Primitive::Void), + &[], + ); + } + + #[inline] + pub fn play(&self, env: &JNIEnv) { + // TODO handle errors + let _ = env.call_method_unchecked( + self.audio_player_ref.as_obj(), + JMethodID::from(self.mid_audio_play as jmethodID), + JavaType::Primitive(Primitive::Void), + &[], + ); + } + + #[inline] + pub fn write_audio_samples(&self, env: &JNIEnv, samples: &[i16]) { + // TODO handle errors + env.set_short_array_region(self.audio_buffer_ref.as_obj().into_inner(), 0, &samples) + .unwrap(); + let _ = env.call_method_unchecked( + self.audio_player_ref.as_obj(), + JMethodID::from(self.mid_audio_write as jmethodID), + JavaType::Primitive(Primitive::Int), + &[ + JValue::from(self.audio_buffer_ref.as_obj()), + JValue::Int(0), // offset_in_shorts + JValue::Int(samples.len() as i32), // size_in_shorts + ], + ); + } +} diff --git a/bindings/rustboyadvance-jni/src/audio/mod.rs b/bindings/rustboyadvance-jni/src/audio/mod.rs new file mode 100644 index 0000000..45b2c89 --- /dev/null +++ b/bindings/rustboyadvance-jni/src/audio/mod.rs @@ -0,0 +1,29 @@ +pub mod connector; +pub mod thread; + +pub mod util { + + use jni::objects::{JObject, JValue}; + use jni::signature::{JavaType, Primitive}; + use jni::JNIEnv; + + pub fn get_sample_rate(env: &JNIEnv, audio_player_obj: JObject) -> i32 { + let audio_player_klass = env.get_object_class(audio_player_obj).unwrap(); + let mid_get_sample_rate = env + .get_method_id(audio_player_klass, "getSampleRate", "()I") + .expect("failed to get methodID for getSampleRate"); + let result = env + .call_method_unchecked( + audio_player_obj, + mid_get_sample_rate, + JavaType::Primitive(Primitive::Int), + &[], + ) + .unwrap(); + let sample_rate = match result { + JValue::Int(sample_rate) => sample_rate as i32, + _ => panic!("bad return value"), + }; + return sample_rate; + } +} diff --git a/bindings/rustboyadvance-jni/src/audio/thread.rs b/bindings/rustboyadvance-jni/src/audio/thread.rs new file mode 100644 index 0000000..a0d78be --- /dev/null +++ b/bindings/rustboyadvance-jni/src/audio/thread.rs @@ -0,0 +1,66 @@ +use super::connector::AudioJNIConnector; + +use std::sync::mpsc::{channel, Sender}; +use std::thread; +use std::thread::JoinHandle; + +use rustboyadvance_core::util::audio::Consumer; + +use jni::JavaVM; + +#[derive(Debug)] +#[allow(dead_code)] +pub enum AudioThreadCommand { + RenderAudio, + Pause, + Play, + Terminate, +} + +pub(crate) fn spawn_audio_worker_thread( + audio_connector: AudioJNIConnector, + jvm: JavaVM, + mut consumer: Consumer, +) -> (JoinHandle, Sender) { + let (tx, rx) = channel(); + + let handle = thread::spawn(move || { + info!("[AudioWorker] spawned!"); + + info!("[AudioWorker] Attaching JVM"); + let env = jvm.attach_current_thread().unwrap(); + + loop { + let command = rx.recv().unwrap(); + match command { + AudioThreadCommand::Pause => { + info!("[AudioWorker] - got {:?} command", command); + audio_connector.pause(&env); + } + + AudioThreadCommand::Play => { + info!("[AudioWorker] - got {:?} command", command); + audio_connector.play(&env); + } + + AudioThreadCommand::RenderAudio => { + let mut samples = [0; 4096 * 2]; // TODO is this memset expansive ? + let count = consumer.pop_slice(&mut samples); + + audio_connector.write_audio_samples(&env, &samples[0..count]); + } + AudioThreadCommand::Terminate => { + info!("[AudioWorker] - got terminate command!"); + break; + } + } + } + + info!("[AudioWorker] terminating"); + + // return the audio connector back + audio_connector + }); + + (handle, tx) +} diff --git a/bindings/rustboyadvance-jni/src/emulator.rs b/bindings/rustboyadvance-jni/src/emulator.rs new file mode 100644 index 0000000..c199bb1 --- /dev/null +++ b/bindings/rustboyadvance-jni/src/emulator.rs @@ -0,0 +1,403 @@ +use rustboyadvance_core::prelude::*; +use rustboyadvance_core::util::audio::{AudioRingBuffer, Producer}; +// use rustboyadvance_core::util::FpsCounter; + +use std::cell::RefCell; +use std::path::Path; +use std::rc::Rc; +use std::sync::{Mutex, MutexGuard}; +use std::time::{Duration, Instant}; + +use jni::objects::{GlobalRef, JMethodID, JObject, JString, JValue}; +use jni::signature; +use jni::sys::{jboolean, jbyteArray, jintArray, jmethodID}; +use jni::JNIEnv; + +use crate::audio::{self, connector::AudioJNIConnector, thread::AudioThreadCommand}; + +struct Hardware { + sample_rate: i32, + audio_producer: Option>, + key_state: u16, +} + +impl AudioInterface for Hardware { + fn push_sample(&mut self, samples: &[i16]) { + if let Some(prod) = &mut self.audio_producer { + for s in samples.iter() { + let _ = prod.push(*s); + } + } else { + // The gba is never ran before audio_producer is initialized + unreachable!() + } + } + + fn get_sample_rate(&self) -> i32 { + self.sample_rate + } +} + +impl InputInterface for Hardware { + fn poll(&mut self) -> u16 { + self.key_state + } +} + +struct Renderer { + renderer_ref: GlobalRef, + frame_buffer_ref: GlobalRef, + mid_render_frame: jmethodID, +} + +impl Renderer { + fn new(env: &JNIEnv, renderer_obj: JObject) -> Result { + let renderer_ref = env + .new_global_ref(renderer_obj) + .map_err(|e| format!("failed to add new global ref, error: {:?}", e))?; + + let frame_buffer = env + .new_int_array(240 * 160) + .map_err(|e| format!("failed to create framebuffer, error: {:?}", e))?; + let frame_buffer_ref = env + .new_global_ref(frame_buffer) + .map_err(|e| format!("failed to add new global ref, error: {:?}", e))?; + let renderer_klass = env + .get_object_class(renderer_ref.as_obj()) + .expect("failed to get renderer class"); + let mid_render_frame = env + .get_method_id(renderer_klass, "renderFrame", "([I)V") + .expect("failed to get methodID for renderFrame") + .into_inner(); + + Ok(Renderer { + renderer_ref, + frame_buffer_ref, + mid_render_frame, + }) + } + + #[inline] + fn render_frame(&self, env: &JNIEnv, buffer: &[u32]) { + unsafe { + env.set_int_array_region( + self.frame_buffer_ref.as_obj().into_inner(), + 0, + std::mem::transmute::<&[u32], &[i32]>(buffer), + ) + .unwrap(); + } + + env.call_method_unchecked( + self.renderer_ref.as_obj(), + JMethodID::from(self.mid_render_frame), + signature::JavaType::Primitive(signature::Primitive::Void), + &[JValue::from(self.frame_buffer_ref.as_obj())], + ) + .expect("failed to call renderFrame"); + } +} + +struct Keypad { + keypad_ref: GlobalRef, + mid_get_key_state: jmethodID, +} + +impl Keypad { + fn new(env: &JNIEnv, keypad_obj: JObject) -> Keypad { + let keypad_ref = env + .new_global_ref(keypad_obj) + .expect("failed to create keypad_ref"); + let keypad_klass = env + .get_object_class(keypad_ref.as_obj()) + .expect("failed to create keypad class"); + let mid_get_key_state = env + .get_method_id(keypad_klass, "getKeyState", "()I") + .expect("failed to get methodID for getKeyState") + .into_inner(); + + Keypad { + keypad_ref, + mid_get_key_state, + } + } + + #[inline] + fn get_key_state(&self, env: &JNIEnv) -> u16 { + match env.call_method_unchecked( + self.keypad_ref.as_obj(), + JMethodID::from(self.mid_get_key_state), + signature::JavaType::Primitive(signature::Primitive::Int), + &[], + ) { + Ok(JValue::Int(key_state)) => key_state as u16, + _ => panic!("failed to call getKeyState"), + } + } +} + +#[derive(Debug, PartialEq, Copy, Clone)] +pub enum EmulationState { + Initial, + Pausing, + Paused, + Running(bool), + Stopping, + Stopped, +} + +impl Default for EmulationState { + fn default() -> EmulationState { + EmulationState::Initial + } +} + +pub struct EmulatorContext { + hwif: Rc>, + renderer: Renderer, + audio_player_ref: GlobalRef, + keypad: Keypad, + pub emustate: Mutex, + pub gba: GameBoyAdvance, +} + +impl EmulatorContext { + pub fn native_open_context( + env: &JNIEnv, + bios: jbyteArray, + rom: jbyteArray, + renderer_obj: JObject, + audio_player: JObject, + keypad_obj: JObject, + save_file: JString, + skip_bios: jboolean, + ) -> Result { + let bios = env + .convert_byte_array(bios) + .map_err(|e| format!("could not get bios buffer, error {}", e))? + .into_boxed_slice(); + let rom = env + .convert_byte_array(rom) + .map_err(|e| format!("could not get rom buffer, error {}", e))? + .into_boxed_slice(); + let save_file: String = env + .get_string(save_file) + .map_err(|_| String::from("could not get save path"))? + .into(); + let gamepak = GamepakBuilder::new() + .take_buffer(rom) + .save_path(&Path::new(&save_file)) + .build() + .map_err(|e| format!("failed to load rom, gba result: {:?}", e))?; + info!("Loaded ROM file {:?}", gamepak.header); + + info!("Creating renderer"); + let renderer = Renderer::new(env, renderer_obj)?; + + info!("Creating GBA Instance"); + let hw = Rc::new(RefCell::new(Hardware { + sample_rate: audio::util::get_sample_rate(env, audio_player), + audio_producer: None, + key_state: 0xffff, + })); + let mut gba = GameBoyAdvance::new(bios, gamepak, hw.clone(), hw.clone()); + if skip_bios != 0 { + info!("skipping bios"); + gba.skip_bios(); + } + + info!("creating keypad"); + let keypad = Keypad::new(env, keypad_obj); + + info!("creating context"); + let audio_player_ref = env.new_global_ref(audio_player).unwrap(); + let context = EmulatorContext { + gba, + keypad, + renderer, + audio_player_ref, + emustate: Mutex::new(EmulationState::default()), + hwif: hw.clone(), + }; + Ok(context) + } + + pub fn native_open_saved_state( + env: &JNIEnv, + state: jbyteArray, + renderer_obj: JObject, + audio_player: JObject, + keypad_obj: JObject, + ) -> Result { + let state = env + .convert_byte_array(state) + .map_err(|e| format!("could not get state buffer, error {}", e))?; + + let renderer = Renderer::new(env, renderer_obj)?; + + let hw = Rc::new(RefCell::new(Hardware { + sample_rate: audio::util::get_sample_rate(env, audio_player), + audio_producer: None, + key_state: 0xffff, + })); + let gba = + GameBoyAdvance::from_saved_state(&state, hw.clone(), hw.clone()).map_err(|e| { + format!( + "failed to create GameBoyAdvance from saved state, error {:?}", + e + ) + })?; + + let keypad = Keypad::new(env, keypad_obj); + + let audio_player_ref = env.new_global_ref(audio_player).unwrap(); + Ok(EmulatorContext { + gba, + keypad, + renderer, + audio_player_ref, + emustate: Mutex::new(EmulationState::default()), + hwif: hw.clone(), + }) + } + + fn render_video(&mut self, env: &JNIEnv) { + self.renderer.render_frame(env, self.gba.get_frame_buffer()); + } + + /// Lock the emulation loop in order to perform updates to the struct + pub fn lock_and_get_gba(&mut self) -> (MutexGuard, &mut GameBoyAdvance) { + (self.emustate.lock().unwrap(), &mut self.gba) + } + + /// Run the emulation main loop + pub fn native_run(&mut self, env: &JNIEnv) -> Result<(), jni::errors::Error> { + const FRAME_TIME: Duration = Duration::from_nanos(1_000_000_000u64 / 60); + + // Set the state to running + *self.emustate.lock().unwrap() = EmulationState::Running(false); + + // Extract current JVM + let jvm = env.get_java_vm().unwrap(); + + // Instanciate an audio player connector + let audio_connector = AudioJNIConnector::new(env, self.audio_player_ref.as_obj()); + + // Create a ringbuffer between the emulator and the audio thread + let (prod, cons) = AudioRingBuffer::new_with_capacity(audio_connector.sample_count).split(); + + // Store the ringbuffer producer in the emulator + self.hwif.borrow_mut().audio_producer = Some(prod); + + // Spawn the audio worker thread, give it the audio connector, jvm and ringbuffer consumer + let (audio_thread_handle, audio_thread_tx) = + audio::thread::spawn_audio_worker_thread(audio_connector, jvm, cons); + + info!("starting main emulation loop"); + + // let mut fps_counter = FpsCounter::default(); + + 'running: loop { + let emustate = *self.emustate.lock().unwrap(); + + let limiter = match emustate { + EmulationState::Initial => unsafe { std::hint::unreachable_unchecked() }, + EmulationState::Stopped => unsafe { std::hint::unreachable_unchecked() }, + EmulationState::Pausing => { + info!("emulation pause requested"); + *self.emustate.lock().unwrap() = EmulationState::Paused; + continue; + } + EmulationState::Paused => continue, + EmulationState::Stopping => break 'running, + EmulationState::Running(turbo) => !turbo, + }; + + let start_time = Instant::now(); + // check key state + self.hwif.borrow_mut().key_state = self.keypad.get_key_state(env); + + // run frame + self.gba.frame(); + + // render video + self.render_video(env); + + // request audio worker to render the audio now + audio_thread_tx + .send(AudioThreadCommand::RenderAudio) + .unwrap(); + + // if let Some(fps) = fps_counter.tick() { + // info!("FPS {}", fps); + // } + + if limiter { + let time_passed = start_time.elapsed(); + let delay = FRAME_TIME.checked_sub(time_passed); + match delay { + None => {} + Some(delay) => { + std::thread::sleep(delay); + } + } + } + } + + info!("stopping, terminating audio worker"); + audio_thread_tx.send(AudioThreadCommand::Terminate).unwrap(); // we surely have an endpoint, so it will work + info!("waiting for audio worker to complete"); + + let audio_connector = audio_thread_handle.join().unwrap(); + info!("audio worker terminated"); + + audio_connector.pause(env); + + self.hwif.borrow_mut().audio_producer = None; + + *self.emustate.lock().unwrap() = EmulationState::Stopped; + + Ok(()) + } + + pub fn native_get_framebuffer(&mut self, env: &JNIEnv) -> jintArray { + let fb = env.new_int_array(240 * 160).unwrap(); + self.pause(); + unsafe { + env.set_int_array_region( + fb, + 0, + std::mem::transmute::<&[u32], &[i32]>(self.gba.get_frame_buffer()), + ) + .unwrap(); + } + self.resume(); + + fb + } + + pub fn pause(&mut self) { + *self.emustate.lock().unwrap() = EmulationState::Pausing; + while *self.emustate.lock().unwrap() != EmulationState::Paused { + info!("awaiting pause...") + } + } + + pub fn resume(&mut self) { + *self.emustate.lock().unwrap() = EmulationState::Running(false); + } + + pub fn set_turbo(&mut self, turbo: bool) { + *self.emustate.lock().unwrap() = EmulationState::Running(turbo); + } + + pub fn request_stop(&mut self) { + if EmulationState::Stopped != *self.emustate.lock().unwrap() { + *self.emustate.lock().unwrap() = EmulationState::Stopping; + } + } + + pub fn is_stopped(&self) -> bool { + *self.emustate.lock().unwrap() == EmulationState::Stopped + } +} diff --git a/bindings/rustboyadvance-jni/src/lib.rs b/bindings/rustboyadvance-jni/src/lib.rs index 3611000..9c7ef52 100644 --- a/bindings/rustboyadvance-jni/src/lib.rs +++ b/bindings/rustboyadvance-jni/src/lib.rs @@ -1,12 +1,12 @@ +mod audio; +mod emulator; /// JNI Bindings for rustboyadvance /// mod rom_helper; -use std::cell::RefCell; +use emulator::EmulatorContext; + use std::os::raw::c_void; -use std::path::Path; -use std::rc::Rc; -use std::sync::{Mutex, MutexGuard}; use jni::objects::*; use jni::sys::*; @@ -21,112 +21,12 @@ use android_log; use env_logger; use rustboyadvance_core::prelude::*; -use rustboyadvance_core::util::audio::AudioRingBuffer; -use rustboyadvance_core::StereoSample; - -struct Hardware { - jvm: JavaVM, - frame_buffer_global_ref: GlobalRef, - audio_buffer: AudioRingBuffer, - key_state: u16, -} - -impl VideoInterface for Hardware { - fn render(&mut self, buffer: &[u32]) { - let env = self.jvm.get_env().unwrap(); - unsafe { - env.set_int_array_region( - self.frame_buffer_global_ref.as_obj().into_inner(), - 0, - std::mem::transmute::<&[u32], &[i32]>(buffer), - ) - .unwrap(); - } - } -} -impl AudioInterface for Hardware { - fn push_sample(&mut self, sample: StereoSample) { - if self.audio_buffer.prod.push(sample.0).is_err() { - warn!("failed to push audio sample"); - } - if self.audio_buffer.prod.push(sample.1).is_err() { - warn!("failed to push audio sample"); - } - } -} -impl InputInterface for Hardware { - fn poll(&mut self) -> u16 { - self.key_state - } -} - -struct Context { - hwif: Rc>, - gba: GameBoyAdvance, -} static mut DID_LOAD: bool = false; const NATIVE_EXCEPTION_CLASS: &'static str = "com/mrmichel/rustboyadvance/EmulatorBindings/NativeBindingException"; -unsafe fn internal_open_context( - env: &JNIEnv, - bios: jbyteArray, - rom: jbyteArray, - frame_buffer: jintArray, - save_file: JString, - skip_bios: jboolean, -) -> Result { - let bios = env - .convert_byte_array(bios) - .map_err(|e| format!("could not get bios buffer, error {}", e))? - .into_boxed_slice(); - let rom = env - .convert_byte_array(rom) - .map_err(|e| format!("could not get rom buffer, error {}", e))? - .into_boxed_slice(); - let save_file: String = env - .get_string(save_file) - .map_err(|_| String::from("could not get save path"))? - .into(); - - let gamepak = GamepakBuilder::new() - .take_buffer(rom) - .save_path(&Path::new(&save_file)) - .build() - .map_err(|e| format!("failed to load rom, gba result: {:?}", e))?; - - info!("Loaded ROM file {:?}", gamepak.header); - - let frame_buffer_global_ref = env - .new_global_ref(JObject::from(frame_buffer)) - .map_err(|e| format!("failed to add new global ref, error: {:?}", e))?; - - let hw = Hardware { - jvm: env.get_java_vm().unwrap(), - frame_buffer_global_ref: frame_buffer_global_ref, - audio_buffer: AudioRingBuffer::new(), - key_state: 0xffff, - }; - let hw = Rc::new(RefCell::new(hw)); - - let mut gba = GameBoyAdvance::new(bios, gamepak, hw.clone(), hw.clone(), hw.clone()); - - if skip_bios != 0 { - debug!("skipping bios"); - gba.skip_bios(); - } - - debug!("creating context"); - let context = Context { - gba: gba, - hwif: hw.clone(), - }; - - Ok(context) -} - fn save_state(env: &JNIEnv, gba: &mut GameBoyAdvance) -> Result { let saved_state = gba .save_state() @@ -149,8 +49,9 @@ fn load_state(env: &JNIEnv, gba: &mut GameBoyAdvance, state: jbyteArray) -> Resu pub mod bindings { use super::*; - unsafe fn lock_ctx<'a>(ctx: jlong) -> MutexGuard<'a, Context> { - (*(ctx as *mut Mutex)).lock().unwrap() + #[inline(always)] + unsafe fn cast_ctx<'a>(ctx: jlong) -> &'a mut EmulatorContext { + &mut (*(ctx as *mut EmulatorContext)) } #[no_mangle] @@ -177,12 +78,23 @@ pub mod bindings { _obj: JClass, bios: jbyteArray, rom: jbyteArray, - frame_buffer: jintArray, + renderer_obj: JObject, + audio_player_obj: JObject, + keypad_obj: JObject, save_file: JString, skip_bios: jboolean, ) -> jlong { - match internal_open_context(&env, bios, rom, frame_buffer, save_file, skip_bios) { - Ok(ctx) => Box::into_raw(Box::new(Mutex::new(ctx))) as jlong, + match EmulatorContext::native_open_context( + &env, + bios, + rom, + renderer_obj, + audio_player_obj, + keypad_obj, + save_file, + skip_bios, + ) { + Ok(ctx) => Box::into_raw(Box::new(ctx)) as jlong, Err(msg) => { env.throw_new(NATIVE_EXCEPTION_CLASS, msg).unwrap(); -1 @@ -190,50 +102,23 @@ pub mod bindings { } } - fn internal_open_saved_state( - env: &JNIEnv, - state: jbyteArray, - frame_buffer: jintArray, - ) -> Result { - let state = env - .convert_byte_array(state) - .map_err(|e| format!("could not get state buffer, error {}", e))?; - - let frame_buffer_global_ref = env - .new_global_ref(JObject::from(frame_buffer)) - .map_err(|e| format!("failed to add new global ref, error: {:?}", e))?; - - let hw = Hardware { - jvm: env.get_java_vm().unwrap(), - frame_buffer_global_ref: frame_buffer_global_ref, - audio_buffer: AudioRingBuffer::new(), - key_state: 0xffff, - }; - let hw = Rc::new(RefCell::new(hw)); - - let gba = GameBoyAdvance::from_saved_state(&state, hw.clone(), hw.clone(), hw.clone()) - .map_err(|e| { - format!( - "failed to create GameBoyAdvance from saved state, error {:?}", - e - ) - })?; - - Ok(Context { - gba: gba, - hwif: hw.clone(), - }) - } - #[no_mangle] pub unsafe extern "C" fn Java_com_mrmichel_rustboyadvance_EmulatorBindings_openSavedState( env: JNIEnv, _obj: JClass, state: jbyteArray, - frame_buffer: jintArray, + renderer_obj: JObject, + audio_player_obj: JObject, + keypad_obj: JObject, ) -> jlong { - match internal_open_saved_state(&env, state, frame_buffer) { - Ok(ctx) => Box::into_raw(Box::new(Mutex::new(ctx))) as jlong, + match EmulatorContext::native_open_saved_state( + &env, + state, + renderer_obj, + audio_player_obj, + keypad_obj, + ) { + Ok(ctx) => Box::into_raw(Box::new(ctx)) as jlong, Err(msg) => { env.throw_new(NATIVE_EXCEPTION_CLASS, msg).unwrap(); -1 @@ -243,58 +128,90 @@ pub mod bindings { #[no_mangle] pub unsafe extern "C" fn Java_com_mrmichel_rustboyadvance_EmulatorBindings_closeEmulator( - env: JNIEnv, - _obj: JClass, - ctx: jlong, - ) { - info!("destroying context {:#x}", ctx); - // consume the wrapped content - let _ = Box::from_raw(ctx as *mut Mutex); - } - - #[no_mangle] - pub unsafe extern "C" fn Java_com_mrmichel_rustboyadvance_EmulatorBindings_runFrame( - env: JNIEnv, - _obj: JClass, - ctx: jlong, - frame_buffer: jintArray, - ) { - let mut ctx = lock_ctx(ctx); - - ctx.gba.frame(); - } - - #[no_mangle] - pub unsafe extern "C" fn Java_com_mrmichel_rustboyadvance_EmulatorBindings_collectAudioSamples( - env: JNIEnv, - _obj: JClass, - ctx: jlong, - ) -> jshortArray { - let ctx = lock_ctx(ctx); - - let mut hw = ctx.hwif.borrow_mut(); - - let mut samples = Vec::with_capacity(1024); - - while let Some(sample) = hw.audio_buffer.cons.pop() { - samples.push(sample); - } - - let arr = env.new_short_array(samples.len() as jsize).unwrap(); - env.set_short_array_region(arr, 0, &samples).unwrap(); - - return arr; - } - - #[no_mangle] - pub unsafe extern "C" fn Java_com_mrmichel_rustboyadvance_EmulatorBindings_setKeyState( _env: JNIEnv, _obj: JClass, ctx: jlong, - key_state: jint, ) { - let mut ctx = lock_ctx(ctx); - ctx.hwif.borrow_mut().key_state = key_state as u16; + info!("waiting for emulation thread to stop"); + + { + let ctx = cast_ctx(ctx); + ctx.request_stop(); + while !ctx.is_stopped() {} + } + + info!("destroying context {:#x}", ctx); + // consume the wrapped content + let _ = Box::from_raw(ctx as *mut EmulatorContext); + } + + #[no_mangle] + pub unsafe extern "C" fn Java_com_mrmichel_rustboyadvance_EmulatorBindings_runMainLoop( + env: JNIEnv, + _obj: JClass, + ctx: jlong, + ) { + let ctx = cast_ctx(ctx); + match ctx.native_run(&env) { + Ok(_) => {} + Err(err) => { + env.throw_new(NATIVE_EXCEPTION_CLASS, format!("Error: {:?}", err)) + .unwrap(); + } + } + } + + #[no_mangle] + pub unsafe extern "C" fn Java_com_mrmichel_rustboyadvance_EmulatorBindings_pause( + _env: JNIEnv, + _obj: JClass, + ctx: jlong, + ) { + let ctx = cast_ctx(ctx); + ctx.pause(); + } + + #[no_mangle] + pub unsafe extern "C" fn Java_com_mrmichel_rustboyadvance_EmulatorBindings_resume( + _env: JNIEnv, + _obj: JClass, + ctx: jlong, + ) { + let ctx = cast_ctx(ctx); + ctx.resume(); + } + + #[no_mangle] + pub unsafe extern "C" fn Java_com_mrmichel_rustboyadvance_EmulatorBindings_setTurbo( + _env: JNIEnv, + _obj: JClass, + ctx: jlong, + turbo: jboolean, + ) { + info!("setTurbo called!"); + let ctx = cast_ctx(ctx); + ctx.set_turbo(turbo != 0); + } + + #[no_mangle] + pub unsafe extern "C" fn Java_com_mrmichel_rustboyadvance_EmulatorBindings_stop( + _env: JNIEnv, + _obj: JClass, + ctx: jlong, + ) { + let ctx = cast_ctx(ctx); + ctx.request_stop(); + while !ctx.is_stopped() {} + } + + #[no_mangle] + pub unsafe extern "C" fn Java_com_mrmichel_rustboyadvance_EmulatorBindings_getFrameBuffer( + env: JNIEnv, + _obj: JClass, + ctx: jlong, + ) -> jintArray { + let ctx = cast_ctx(ctx); + ctx.native_get_framebuffer(&env) } #[no_mangle] @@ -303,9 +220,14 @@ pub mod bindings { _obj: JClass, ctx: jlong, ) -> jbyteArray { - let mut ctx = lock_ctx(ctx); - match save_state(&env, &mut ctx.gba) { + let ctx = cast_ctx(ctx); + ctx.pause(); + let (_lock, gba) = ctx.lock_and_get_gba(); + match save_state(&env, gba) { Ok(result) => { + drop(_lock); + drop(gba); + ctx.resume(); return result; } Err(msg) => { @@ -322,9 +244,15 @@ pub mod bindings { ctx: jlong, state: jbyteArray, ) { - let mut ctx = lock_ctx(ctx); - match load_state(&env, &mut ctx.gba, state) { - Ok(_) => {} + let ctx = cast_ctx(ctx); + ctx.pause(); + let (_lock, gba) = ctx.lock_and_get_gba(); + match load_state(&env, gba, state) { + Ok(_) => { + drop(_lock); + drop(gba); + ctx.resume(); + } Err(msg) => env.throw_new(NATIVE_EXCEPTION_CLASS, msg).unwrap(), } } @@ -335,7 +263,7 @@ pub mod bindings { _obj: JClass, ctx: jlong, ) -> jstring { - let ctx = lock_ctx(ctx); + let ctx = cast_ctx(ctx); env.new_string(ctx.gba.get_game_title()) .unwrap() .into_inner() @@ -347,7 +275,7 @@ pub mod bindings { _obj: JClass, ctx: jlong, ) -> jstring { - let ctx = lock_ctx(ctx); + let ctx = cast_ctx(ctx); env.new_string(ctx.gba.get_game_code()) .unwrap() .into_inner() @@ -359,7 +287,7 @@ pub mod bindings { _obj: JClass, ctx: jlong, ) { - let ctx = lock_ctx(ctx); + let ctx = cast_ctx(ctx); info!("CPU LOG: {:#x?}", ctx.gba.cpu); } } diff --git a/bindings/rustboyadvance-jni/src/rom_helper.rs b/bindings/rustboyadvance-jni/src/rom_helper.rs index cf7671f..d0c4c3b 100644 --- a/bindings/rustboyadvance-jni/src/rom_helper.rs +++ b/bindings/rustboyadvance-jni/src/rom_helper.rs @@ -9,22 +9,26 @@ fn parse_rom_header(env: &JNIEnv, barr: jbyteArray) -> cartridge::header::Cartri cartridge::header::parse(&rom_data).unwrap() } -#[no_mangle] -pub unsafe extern "C" fn Java_com_mrmichel_rustboyadvance_RomHelper_getGameCode( - env: JNIEnv, - _obj: JClass, - rom_data: jbyteArray, -) -> jstring { - let header = parse_rom_header(&env, rom_data); - env.new_string(header.game_code).unwrap().into_inner() -} +mod bindings { + use super::*; -#[no_mangle] -pub unsafe extern "C" fn Java_com_mrmichel_rustboyadvance_RomHelper_getGameTitle( - env: JNIEnv, - _obj: JClass, - rom_data: jbyteArray, -) -> jstring { - let header = parse_rom_header(&env, rom_data); - env.new_string(header.game_title).unwrap().into_inner() + #[no_mangle] + pub unsafe extern "C" fn Java_com_mrmichel_rustboyadvance_RomHelper_getGameCode( + env: JNIEnv, + _obj: JClass, + rom_data: jbyteArray, + ) -> jstring { + let header = parse_rom_header(&env, rom_data); + env.new_string(header.game_code).unwrap().into_inner() + } + + #[no_mangle] + pub unsafe extern "C" fn Java_com_mrmichel_rustboyadvance_RomHelper_getGameTitle( + env: JNIEnv, + _obj: JClass, + rom_data: jbyteArray, + ) -> jstring { + let header = parse_rom_header(&env, rom_data); + env.new_string(header.game_title).unwrap().into_inner() + } } diff --git a/core/src/lib.rs b/core/src/lib.rs index f3f3e80..e89a4a6 100644 --- a/core/src/lib.rs +++ b/core/src/lib.rs @@ -76,7 +76,7 @@ pub trait AudioInterface { /// Sample should be normilized to siged 16bit values /// Note: It is not guarentied that the sample will be played #[allow(unused_variables)] - fn push_sample(&mut self, samples: StereoSample) {} + fn push_sample(&mut self, samples: &[i16]) {} } pub trait InputInterface { diff --git a/core/src/sound/mod.rs b/core/src/sound/mod.rs index a8aa575..01176b1 100644 --- a/core/src/sound/mod.rs +++ b/core/src/sound/mod.rs @@ -349,10 +349,10 @@ impl SoundController { let mut audio = audio_device.borrow_mut(); self.output_buffer.drain(..).for_each(|(left, right)| { - audio.push_sample(( + audio.push_sample(&[ (left.round() as i16) * (std::i16::MAX / 512), (right.round() as i16) * (std::i16::MAX / 512), - )); + ]); }); } if self.cycles_per_sample < *cycles_to_next_event { diff --git a/core/src/util.rs b/core/src/util.rs index d8bec0e..e7d0b6c 100644 --- a/core/src/util.rs +++ b/core/src/util.rs @@ -132,16 +132,20 @@ macro_rules! host_breakpoint { } pub mod audio { - use ringbuf::{Consumer, Producer, RingBuffer}; + pub use ringbuf::{Consumer, Producer, RingBuffer}; pub struct AudioRingBuffer { - pub prod: Producer, - pub cons: Consumer, + prod: Producer, + cons: Consumer, } impl AudioRingBuffer { pub fn new() -> AudioRingBuffer { - let rb = RingBuffer::new(4096 * 2); + AudioRingBuffer::new_with_capacity(2 * 4096) + } + + pub fn new_with_capacity(capacity: usize) -> AudioRingBuffer { + let rb = RingBuffer::new(capacity); let (prod, cons) = rb.split(); AudioRingBuffer { prod, cons } @@ -154,6 +158,10 @@ pub mod audio { pub fn consumer(&mut self) -> &mut Consumer { &mut self.cons } + + pub fn split(self) -> (Producer, Consumer) { + (self.prod, self.cons) + } } } diff --git a/platform/android/app/src/main/java/com/mrmichel/rustboyadvance/EmulatorBindings.java b/platform/android/app/src/main/java/com/mrmichel/rustboyadvance/EmulatorBindings.java index 96c3789..ff36eb7 100644 --- a/platform/android/app/src/main/java/com/mrmichel/rustboyadvance/EmulatorBindings.java +++ b/platform/android/app/src/main/java/com/mrmichel/rustboyadvance/EmulatorBindings.java @@ -9,62 +9,65 @@ public class EmulatorBindings { System.loadLibrary("rustboyadvance_jni"); } - public class NativeBindingException extends Exception { - public NativeBindingException(String errorMessage) { - super(errorMessage); - } - } - /** * Open a new emulator context - * @param bios bytearray of the GBA bios - * @param rom bytearray of the rom to run - * @param frameBuffer frameBuffer render target - * @param save_name name of the save file TODO remove this - * @param skipBios skip bios + * + * @param bios bytearray of the GBA bios + * @param rom bytearray of the rom to run + * @param renderer renderer instance + * @param audioPlayer audio player instance + * @param keypad Keypad instance + * @param save_name name of the save file TODO remove this + * @param skipBios skip bios * @return the emulator context to use pass to other methods in this class * @throws NativeBindingException */ - public static native long openEmulator(byte[] bios, byte[] rom, int[] frameBuffer, String save_name, boolean skipBios) throws NativeBindingException; + public static native long openEmulator(byte[] bios, byte[] rom, IFrameRenderer renderer, IAudioPlayer audioPlayer, Keypad keypad, String save_name, boolean skipBios) throws NativeBindingException; /** * Open a new emulator context from a saved state buffer - * @param savedState - * @param frameBuffer + * + * @param savedState saved state buffer + * @param renderer renderer instance + * @param audioPlayer audio player instance + * @param keypad Keypad instance * @return * @throws NativeBindingException */ - public static native long openSavedState(byte[] savedState, int[] frameBuffer) throws NativeBindingException; - - /** - * Make the emulator boot directly into the cartridge - * @param ctx - * @throws NativeBindingException - */ - public static native void skipBios(long ctx) throws NativeBindingException; - + public static native long openSavedState(byte[] savedState, IFrameRenderer renderer, IAudioPlayer audioPlayer, Keypad keypad) throws NativeBindingException; /** * Destroys the emulator instance * should be put in a finalizer or else the emulator context may leak. + * * @param ctx */ public static native void closeEmulator(long ctx); - /** - * Runs the emulation for a single frame. + * Run the emulation thread + * * @param ctx - * @param frame_buffer will be filled with the frame buffer to render */ - public static native void runFrame(long ctx, int[] frame_buffer); + public static native void runMainLoop(long ctx); - /** - * Collect pending audio samples - * @param ctx - * @return sample buffer - */ - public static native short[] collectAudioSamples(long ctx); + public static native void pause(long ctx); + + public static native void resume(long ctx); + + public static native void setTurbo(long ctx, boolean turbo); + + public static native void stop(long ctx); + + + public static native int[] getFrameBuffer(long ctx); + +// /** +// * Runs the emulation for a single frame. +// * @param ctx +// * @param frame_buffer will be filled with the frame buffer to render +// */ +// public static native void runFrame(long ctx, int[] frame_buffer); /** * @param ctx @@ -78,9 +81,9 @@ public class EmulatorBindings { */ public static native String getGameCode(long ctx); - /** * Sets the keystate + * * @param keyState */ public static native void setKeyState(long ctx, int keyState); @@ -105,7 +108,14 @@ public class EmulatorBindings { /** * Logs the emulator state + * * @return non-zero value on failure */ public static native void log(long ctx); + + public class NativeBindingException extends Exception { + public NativeBindingException(String errorMessage) { + super(errorMessage); + } + } } diff --git a/platform/android/app/src/main/java/com/mrmichel/rustboyadvance/IAudioPlayer.java b/platform/android/app/src/main/java/com/mrmichel/rustboyadvance/IAudioPlayer.java new file mode 100644 index 0000000..e6386b0 --- /dev/null +++ b/platform/android/app/src/main/java/com/mrmichel/rustboyadvance/IAudioPlayer.java @@ -0,0 +1,15 @@ +package com.mrmichel.rustboyadvance; + +public interface IAudioPlayer { + int audioWrite(short[] buffer, int offsetInShorts, int sizeInShorts); + + void pause(); + + void play(); + + int getSampleCount(); + + int getSampleRate(); + + int availableBufferSize(); +} diff --git a/platform/android/app/src/main/java/com/mrmichel/rustboyadvance/IFrameRenderer.java b/platform/android/app/src/main/java/com/mrmichel/rustboyadvance/IFrameRenderer.java new file mode 100644 index 0000000..63230ad --- /dev/null +++ b/platform/android/app/src/main/java/com/mrmichel/rustboyadvance/IFrameRenderer.java @@ -0,0 +1,5 @@ +package com.mrmichel.rustboyadvance; + +public interface IFrameRenderer { + void renderFrame(int[] framebuffer); +} diff --git a/platform/android/app/src/main/java/com/mrmichel/rustdroid_emu/core/Keypad.java b/platform/android/app/src/main/java/com/mrmichel/rustboyadvance/Keypad.java similarity index 85% rename from platform/android/app/src/main/java/com/mrmichel/rustdroid_emu/core/Keypad.java rename to platform/android/app/src/main/java/com/mrmichel/rustboyadvance/Keypad.java index 6d73f42..994c631 100644 --- a/platform/android/app/src/main/java/com/mrmichel/rustdroid_emu/core/Keypad.java +++ b/platform/android/app/src/main/java/com/mrmichel/rustboyadvance/Keypad.java @@ -1,4 +1,4 @@ -package com.mrmichel.rustdroid_emu.core; +package com.mrmichel.rustboyadvance; public class Keypad { private int keyState; @@ -11,6 +11,18 @@ public class Keypad { this.keyState = 0xffff; } + public void onKeyDown(Key key) { + this.keyState = this.keyState & ~(1 << key.keyBit); + } + + public void onKeyUp(Key key) { + this.keyState = this.keyState | (1 << key.keyBit); + } + + public int getKeyState() { + return keyState; + } + public enum Key { ButtonA(0), ButtonB(1), @@ -25,20 +37,8 @@ public class Keypad { private final int keyBit; - private Key(int keyBit) { + Key(int keyBit) { this.keyBit = keyBit; } } - - public void onKeyDown(Key key) { - this.keyState = this.keyState & ~(1 << key.keyBit); - } - - public void onKeyUp(Key key) { - this.keyState = this.keyState | (1 << key.keyBit); - } - - public int getKeyState() { - return keyState; - } } diff --git a/platform/android/app/src/main/java/com/mrmichel/rustdroid_emu/core/AndroidAudioPlayer.java b/platform/android/app/src/main/java/com/mrmichel/rustdroid_emu/core/AndroidAudioPlayer.java new file mode 100644 index 0000000..0cc99de --- /dev/null +++ b/platform/android/app/src/main/java/com/mrmichel/rustdroid_emu/core/AndroidAudioPlayer.java @@ -0,0 +1,89 @@ +package com.mrmichel.rustdroid_emu.core; + +import android.media.AudioFormat; +import android.media.AudioManager; +import android.media.AudioTrack; +import android.os.Build; +import android.util.Log; + +import com.mrmichel.rustboyadvance.IAudioPlayer; + + +/** + * Simple wrapper around the android AudioTrack class that implements IAudioPlayer + */ +public class AndroidAudioPlayer implements IAudioPlayer { + private static final String TAG = "AndroidAudioPlayer"; + + private static final int BUFFER_SIZE_IN_BYTES = 8192; + private static int SAMPLE_RATE_HZ = 44100; + + private AudioTrack audioTrack; + + public AndroidAudioPlayer() { + if (Build.VERSION.SDK_INT >= 23) { + AudioTrack.Builder audioTrackBuilder = new AudioTrack.Builder() + .setAudioFormat(new AudioFormat.Builder() + .setEncoding(AudioFormat.ENCODING_PCM_16BIT) + .setSampleRate(SAMPLE_RATE_HZ) + .setChannelMask(AudioFormat.CHANNEL_IN_STEREO | AudioFormat.CHANNEL_OUT_STEREO) + .build() + ) + .setBufferSizeInBytes(AndroidAudioPlayer.BUFFER_SIZE_IN_BYTES) + .setTransferMode(AudioTrack.MODE_STREAM); + if (Build.VERSION.SDK_INT >= 26) { + audioTrackBuilder.setPerformanceMode(AudioTrack.PERFORMANCE_MODE_LOW_LATENCY); + } + this.audioTrack = audioTrackBuilder.build(); + } else { + this.audioTrack = new AudioTrack( + AudioManager.STREAM_MUSIC, + SAMPLE_RATE_HZ, + AudioFormat.CHANNEL_IN_STEREO | AudioFormat.CHANNEL_OUT_STEREO, + AudioFormat.ENCODING_PCM_16BIT, + AndroidAudioPlayer.BUFFER_SIZE_IN_BYTES, + AudioTrack.MODE_STREAM); + } + Log.d(TAG, "sampleCount = " + this.getSampleCount()); + } + + @Override + public int audioWrite(short[] buffer, int offsetInShorts, int sizeInShorts) { + if (Build.VERSION.SDK_INT >= 23) { + return this.audioTrack.write(buffer, offsetInShorts, sizeInShorts, AudioTrack.WRITE_NON_BLOCKING); + } else { + // Native bindings will do its best to make sure this doesn't block anyway + return this.audioTrack.write(buffer, offsetInShorts, sizeInShorts); + } + } + + @Override + public void pause() { + this.audioTrack.pause(); + } + + @Override + public void play() { + this.audioTrack.play(); + } + + @Override + public int getSampleCount() { + if (Build.VERSION.SDK_INT >= 23) { + return this.audioTrack.getBufferSizeInFrames(); + } else { + return BUFFER_SIZE_IN_BYTES / 2; + } + } + + @Override + public int getSampleRate() { + return this.audioTrack.getSampleRate(); + } + + @Override + public int availableBufferSize() { + return 2; + } + +} diff --git a/platform/android/app/src/main/java/com/mrmichel/rustdroid_emu/core/AudioThread.java b/platform/android/app/src/main/java/com/mrmichel/rustdroid_emu/core/AudioThread.java deleted file mode 100644 index 89cf780..0000000 --- a/platform/android/app/src/main/java/com/mrmichel/rustdroid_emu/core/AudioThread.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.mrmichel.rustdroid_emu.core; - -import android.media.AudioTrack; - -public class AudioThread extends Thread { - - AudioTrack audioTrack; - Emulator emulator; - boolean enabled; - boolean stopping; - - public AudioThread(AudioTrack audioTrack, Emulator emulator) { - super(); - this.audioTrack = audioTrack; - this.emulator = emulator; - this.enabled = true; - this.stopping = false; - } - - public void setStopping(boolean stopping) { - this.stopping = stopping; - } - - public void setEnabled(boolean enabled) { - this.enabled = enabled; - } - - public boolean isStopping() { - return stopping; - } - - public boolean isEnabled() { - return enabled; - } - - @Override - public void run() { - super.run(); - - while (!stopping) { - if (enabled) { - short[] samples = emulator.collectAudioSamples(); - audioTrack.write(samples, 0, samples.length); - } - } - } -} diff --git a/platform/android/app/src/main/java/com/mrmichel/rustdroid_emu/core/Emulator.java b/platform/android/app/src/main/java/com/mrmichel/rustdroid_emu/core/Emulator.java index 9d22740..c670dfb 100644 --- a/platform/android/app/src/main/java/com/mrmichel/rustdroid_emu/core/Emulator.java +++ b/platform/android/app/src/main/java/com/mrmichel/rustdroid_emu/core/Emulator.java @@ -1,29 +1,27 @@ package com.mrmichel.rustdroid_emu.core; import com.mrmichel.rustboyadvance.EmulatorBindings; +import com.mrmichel.rustboyadvance.IFrameRenderer; +import com.mrmichel.rustboyadvance.Keypad; public class Emulator { - public class EmulatorException extends Exception { - public EmulatorException(String errorMessage) { - super(errorMessage); - } - } - + public Keypad keypad; /// context received by the native binding private long ctx = -1; - private int[] frameBuffer; - public Keypad keypad; - - public Emulator() { - this.frameBuffer = new int[240 * 160]; + private AndroidAudioPlayer audioPlayer; + private IFrameRenderer frameRenderer; + public Emulator(IFrameRenderer frameRenderer, AndroidAudioPlayer audioPlayer) { this.keypad = new Keypad(); + this.frameRenderer = frameRenderer; + this.audioPlayer = audioPlayer; } - public Emulator(long ctx) { + public Emulator(long ctx, IFrameRenderer frameRenderer, AndroidAudioPlayer audioPlayer) { this.ctx = ctx; - this.frameBuffer = new int[240 * 160]; + this.frameRenderer = frameRenderer; + this.audioPlayer = audioPlayer; this.keypad = new Keypad(); } @@ -35,29 +33,38 @@ public class Emulator { return ctx; } + public void runMainLoop() { + EmulatorBindings.runMainLoop(this.ctx); + } + + public void pause() { + EmulatorBindings.pause(this.ctx); + this.audioPlayer.pause(); + } + + public void resume() { + EmulatorBindings.resume(this.ctx); + this.audioPlayer.play(); + } + + public void setTurbo(boolean turbo) { + EmulatorBindings.setTurbo(ctx, turbo); + } + + public void stop() { + EmulatorBindings.stop(this.ctx); + this.audioPlayer.pause(); + + } + public int[] getFrameBuffer() { - return frameBuffer; + return EmulatorBindings.getFrameBuffer(this.ctx); } - public synchronized void runFrame() { - EmulatorBindings.setKeyState(ctx, keypad.getKeyState()); - EmulatorBindings.runFrame(ctx, frameBuffer); - } - - public synchronized short[] collectAudioSamples() { - return EmulatorBindings.collectAudioSamples(ctx); - } - - public synchronized void setKeyState(int keyState) { - EmulatorBindings.setKeyState(this.ctx, keyState); - } - - public synchronized byte[] saveState() throws EmulatorBindings.NativeBindingException { return EmulatorBindings.saveState(this.ctx); } - public synchronized void loadState(byte[] state) throws EmulatorBindings.NativeBindingException { if (ctx != -1) { EmulatorBindings.loadState(this.ctx, state); @@ -66,13 +73,12 @@ public class Emulator { } } - public synchronized void open(byte[] bios, byte[] rom, String saveName, boolean skipBios) throws EmulatorBindings.NativeBindingException { - this.ctx = EmulatorBindings.openEmulator(bios, rom, this.frameBuffer, saveName, skipBios); + this.ctx = EmulatorBindings.openEmulator(bios, rom, this.frameRenderer, this.audioPlayer, this.keypad, saveName, skipBios); } public synchronized void openSavedState(byte[] savedState) throws EmulatorBindings.NativeBindingException { - this.ctx = EmulatorBindings.openSavedState(savedState, this.frameBuffer); + this.ctx = EmulatorBindings.openSavedState(savedState, this.frameRenderer, this.audioPlayer, this.keypad); } public synchronized void close() { @@ -112,4 +118,10 @@ public class Emulator { public synchronized void log() { EmulatorBindings.log(this.ctx); } + + public class EmulatorException extends Exception { + public EmulatorException(String errorMessage) { + super(errorMessage); + } + } } diff --git a/platform/android/app/src/main/java/com/mrmichel/rustdroid_emu/core/SnapshotManager.java b/platform/android/app/src/main/java/com/mrmichel/rustdroid_emu/core/SnapshotManager.java index d98a0d1..8ef5a71 100644 --- a/platform/android/app/src/main/java/com/mrmichel/rustdroid_emu/core/SnapshotManager.java +++ b/platform/android/app/src/main/java/com/mrmichel/rustdroid_emu/core/SnapshotManager.java @@ -10,7 +10,6 @@ import android.graphics.BitmapFactory; import com.mrmichel.rustdroid_emu.Util; -import java.io.ByteArrayOutputStream; import java.io.File; import java.sql.Timestamp; import java.util.ArrayList; @@ -74,7 +73,7 @@ public class SnapshotManager { SQLiteDatabase db = dbHelper.getWritableDatabase(); File file = snapshot.getFile(); - db.delete(dbHelper.TABLE_NAME, "dataFile = '" + file.toString() + "'", null); + db.delete(SnapshotDatabaseHelper.TABLE_NAME, "dataFile = '" + file.toString() + "'", null); file.delete(); } diff --git a/platform/android/app/src/main/java/com/mrmichel/rustdroid_emu/ui/EmulationThread.java b/platform/android/app/src/main/java/com/mrmichel/rustdroid_emu/ui/EmulationThread.java index 3434be5..11206f9 100644 --- a/platform/android/app/src/main/java/com/mrmichel/rustdroid_emu/ui/EmulationThread.java +++ b/platform/android/app/src/main/java/com/mrmichel/rustdroid_emu/ui/EmulationThread.java @@ -1,43 +1,35 @@ package com.mrmichel.rustdroid_emu.ui; +import android.util.Log; + import com.mrmichel.rustdroid_emu.core.Emulator; public class EmulationThread extends Thread { + private static final String TAG = "EmulationThread"; + public static final long NANOSECONDS_PER_MILLISECOND = 1000000; public static final long FRAME_TIME = 1000000000 / 60; private Emulator emulator; private ScreenView screenView; - private boolean turbo; private boolean running; - private boolean stopping; public EmulationThread(Emulator emulator, ScreenView screenView) { this.emulator = emulator; this.screenView = screenView; - this.running = true; - } - - public void setStopping(boolean stopping) { - this.stopping = stopping; + this.running = false; } public void pauseEmulation() { - running = false; + this.emulator.pause(); } public void resumeEmulation() { - running = true; + this.emulator.resume(); } - public void setTurbo(boolean turbo) { - this.turbo = turbo; - } - - public boolean isTurbo() { return turbo; } - @Override public void run() { super.run(); @@ -45,27 +37,12 @@ public class EmulationThread extends Thread { // wait until renderer is ready while (!screenView.getRenderer().isReady()); - while (!stopping) { - if (running) { - long startTimer = System.nanoTime(); - emulator.runFrame(); - if (!turbo) { - long currentTime = System.nanoTime(); - long timePassed = currentTime - startTimer; + while (!emulator.isOpen()); - long delay = FRAME_TIME - timePassed; - if (delay > 0) { - try { - Thread.sleep(delay / NANOSECONDS_PER_MILLISECOND); - } catch (Exception e) { - - } - } - } - - screenView.updateFrame(emulator.getFrameBuffer()); - } - } + running = true; + emulator.runMainLoop(); + Log.d(TAG, "Native runMainLoop returned!"); + running = false; } diff --git a/platform/android/app/src/main/java/com/mrmichel/rustdroid_emu/ui/EmulatorActivity.java b/platform/android/app/src/main/java/com/mrmichel/rustdroid_emu/ui/EmulatorActivity.java index c1bdb1f..444828c 100644 --- a/platform/android/app/src/main/java/com/mrmichel/rustdroid_emu/ui/EmulatorActivity.java +++ b/platform/android/app/src/main/java/com/mrmichel/rustdroid_emu/ui/EmulatorActivity.java @@ -1,6 +1,5 @@ package com.mrmichel.rustdroid_emu.ui; -import android.app.Activity; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; @@ -8,7 +7,6 @@ import android.graphics.Bitmap; import android.media.AudioFormat; import android.media.AudioManager; import android.media.AudioTrack; -import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.util.Log; @@ -28,11 +26,11 @@ import androidx.appcompat.app.AppCompatActivity; import androidx.preference.PreferenceManager; import com.mrmichel.rustboyadvance.EmulatorBindings; +import com.mrmichel.rustboyadvance.Keypad; import com.mrmichel.rustdroid_emu.R; import com.mrmichel.rustdroid_emu.Util; -import com.mrmichel.rustdroid_emu.core.AudioThread; +import com.mrmichel.rustdroid_emu.core.AndroidAudioPlayer; import com.mrmichel.rustdroid_emu.core.Emulator; -import com.mrmichel.rustdroid_emu.core.Keypad; import com.mrmichel.rustdroid_emu.core.RomManager; import com.mrmichel.rustdroid_emu.core.Snapshot; import com.mrmichel.rustdroid_emu.core.SnapshotManager; @@ -42,7 +40,6 @@ import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; -import java.io.InputStream; public class EmulatorActivity extends AppCompatActivity implements View.OnClickListener, View.OnTouchListener { @@ -53,15 +50,12 @@ public class EmulatorActivity extends AppCompatActivity implements View.OnClickL private static final int LOAD_ROM_REQUESTCODE = 123; private static final int LOAD_SNAPSHOT_REQUESTCODE = 124; - private static int SAMPLE_RATE_HZ = 44100; - private Menu menu; private RomManager.RomMetadataEntry romMetadata; private byte[] bios; private EmulationThread emulationThread; - private AudioThread audioThread; - private AudioTrack audioTrack; + private AndroidAudioPlayer audioPlayer; private byte[] on_resume_saved_state = null; private Emulator emulator; @@ -78,7 +72,7 @@ public class EmulatorActivity extends AppCompatActivity implements View.OnClickL if (!isEmulatorRunning()) { return; } - emulationThread.setTurbo(((CompoundButton) findViewById(R.id.tbTurbo)).isChecked()); + emulator.setTurbo(((CompoundButton) findViewById(R.id.tbTurbo)).isChecked()); } } @@ -244,18 +238,9 @@ public class EmulatorActivity extends AppCompatActivity implements View.OnClickL } private void killThreads() { - if (audioThread != null) { - audioThread.setStopping(true); - try { - audioThread.join(); - } catch (InterruptedException e) { - Log.e(TAG, "audio thread join interrupted"); - } - audioThread = null; - } if (emulationThread != null) { try { - emulationThread.setStopping(true); + emulator.stop(); emulationThread.join(); } catch (InterruptedException e) { Log.e(TAG, "emulation thread join interrupted"); @@ -266,12 +251,8 @@ public class EmulatorActivity extends AppCompatActivity implements View.OnClickL private void createThreads() { emulationThread = new EmulationThread(emulator, screenView); - audioThread = new AudioThread(audioTrack, emulator); - - emulationThread.setTurbo(turboButton.isChecked()); - + emulator.setTurbo(turboButton.isChecked()); emulationThread.start(); - audioThread.start(); } public void onRomLoaded(byte[] rom, String savePath) { @@ -313,7 +294,7 @@ public class EmulatorActivity extends AppCompatActivity implements View.OnClickL outState.putString("saveFile", saveFile.getPath()); - outState.putBoolean("turbo", emulationThread.isTurbo()); + outState.putBoolean("turbo", false); } catch (Exception e) { Util.showAlertDiaglogAndExit(this, e); @@ -328,30 +309,7 @@ public class EmulatorActivity extends AppCompatActivity implements View.OnClickL this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION); - if (Build.VERSION.SDK_INT >= 23) { - AudioTrack.Builder audioTrackBuilder = new AudioTrack.Builder() - .setAudioFormat(new AudioFormat.Builder() - .setEncoding(AudioFormat.ENCODING_PCM_16BIT) - .setSampleRate(SAMPLE_RATE_HZ) - .setChannelMask(AudioFormat.CHANNEL_IN_STEREO | AudioFormat.CHANNEL_OUT_STEREO) - .build() - ) - .setBufferSizeInBytes(4096) - .setTransferMode(AudioTrack.MODE_STREAM); - if (Build.VERSION.SDK_INT >= 26) { - audioTrackBuilder.setPerformanceMode(AudioTrack.PERFORMANCE_MODE_LOW_LATENCY); - } - this.audioTrack = audioTrackBuilder.build(); - } else { - this.audioTrack = new AudioTrack( - AudioManager.STREAM_MUSIC, - SAMPLE_RATE_HZ, - AudioFormat.CHANNEL_IN_STEREO | AudioFormat.CHANNEL_OUT_STEREO, - AudioFormat.ENCODING_PCM_16BIT, - 4096, - AudioTrack.MODE_STREAM); - } - this.audioTrack.play(); + this.audioPlayer = new AndroidAudioPlayer(); findViewById(R.id.bStart).setOnTouchListener(this); findViewById(R.id.bSelect).setOnTouchListener(this); @@ -370,7 +328,7 @@ public class EmulatorActivity extends AppCompatActivity implements View.OnClickL this.bios = getIntent().getByteArrayExtra("bios"); this.screenView = findViewById(R.id.gba_view); - this.emulator = new Emulator(); + this.emulator = new Emulator(this.screenView, this.audioPlayer); final String saveFilePath; @@ -406,7 +364,7 @@ public class EmulatorActivity extends AppCompatActivity implements View.OnClickL boolean turbo = savedInstanceState.getBoolean("turbo"); turboButton.setPressed(turbo); - emulationThread.setTurbo(turbo); + emulator.setTurbo(turbo); } catch (Exception e) { Util.showAlertDiaglogAndExit(thisActivity, e); @@ -481,7 +439,6 @@ public class EmulatorActivity extends AppCompatActivity implements View.OnClickL @Override protected void onDestroy() { super.onDestroy(); - audioTrack.stop(); pauseEmulation(); killThreads(); } @@ -489,7 +446,6 @@ public class EmulatorActivity extends AppCompatActivity implements View.OnClickL @Override protected void onPause() { super.onPause(); - audioTrack.stop(); pauseEmulation(); screenView.onPause(); } @@ -499,7 +455,7 @@ public class EmulatorActivity extends AppCompatActivity implements View.OnClickL super.onResume(); screenView.onResume(); resumeEmulation(); - audioTrack.play(); + audioPlayer.play(); } public void doSaveSnapshot() { diff --git a/platform/android/app/src/main/java/com/mrmichel/rustdroid_emu/ui/ScreenView.java b/platform/android/app/src/main/java/com/mrmichel/rustdroid_emu/ui/ScreenView.java index 6aa3ff0..1dcb979 100644 --- a/platform/android/app/src/main/java/com/mrmichel/rustdroid_emu/ui/ScreenView.java +++ b/platform/android/app/src/main/java/com/mrmichel/rustdroid_emu/ui/ScreenView.java @@ -7,7 +7,9 @@ import android.util.AttributeSet; import androidx.preference.PreferenceManager; -public class ScreenView extends GLSurfaceView implements SharedPreferences.OnSharedPreferenceChangeListener { +import com.mrmichel.rustboyadvance.IFrameRenderer; + +public class ScreenView extends GLSurfaceView implements SharedPreferences.OnSharedPreferenceChangeListener, IFrameRenderer { private ScreenRenderer mRenderer; public ScreenView(Context context) { @@ -33,11 +35,6 @@ public class ScreenView extends GLSurfaceView implements SharedPreferences.OnSha this.setRenderMode(RENDERMODE_WHEN_DIRTY); } - public void updateFrame(int[] frameBuffer) { - mRenderer.updateTexture(frameBuffer); - requestRender(); - } - public ScreenRenderer getRenderer() { return mRenderer; } @@ -49,4 +46,10 @@ public class ScreenView extends GLSurfaceView implements SharedPreferences.OnSha mRenderer.setColorCorrection(colorCorrection); } } + + @Override + public void renderFrame(int[] frameBuffer) { + mRenderer.updateTexture(frameBuffer); + requestRender(); + } } diff --git a/platform/rustboyadvance-sdl2/Cargo.toml b/platform/rustboyadvance-sdl2/Cargo.toml index 7606733..e967cf2 100644 --- a/platform/rustboyadvance-sdl2/Cargo.toml +++ b/platform/rustboyadvance-sdl2/Cargo.toml @@ -7,7 +7,7 @@ edition = "2018" [dependencies] rustboyadvance-core = { path = "../../core/", features = ["elf_support"] } sdl2 = { version = "0.33.0", features = ["image"] } -ringbuf = "0.2.1" +ringbuf = "0.2.2" bytesize = "1.0.0" clap = { version = "2.33", features = ["color", "yaml"] } log = "0.4.8" diff --git a/platform/rustboyadvance-sdl2/src/audio.rs b/platform/rustboyadvance-sdl2/src/audio.rs index 1aad34d..b1b2c67 100644 --- a/platform/rustboyadvance-sdl2/src/audio.rs +++ b/platform/rustboyadvance-sdl2/src/audio.rs @@ -40,9 +40,9 @@ impl AudioInterface for Sdl2AudioPlayer { self.freq } - fn push_sample(&mut self, sample: StereoSample) { + fn push_sample(&mut self, sample: &[i16]) { #![allow(unused_must_use)] - self.producer.push(sample); + self.producer.push((sample[0], sample[1])); } } diff --git a/platform/rustboyadvance-wasm/src/emulator.rs b/platform/rustboyadvance-wasm/src/emulator.rs index 8e95788..794704c 100644 --- a/platform/rustboyadvance-wasm/src/emulator.rs +++ b/platform/rustboyadvance-wasm/src/emulator.rs @@ -70,8 +70,8 @@ impl AudioInterface for Interface { } fn push_sample(&mut self, samples: StereoSample) { - self.audio_ring_buffer.prod.push(samples.0).unwrap(); - self.audio_ring_buffer.prod.push(samples.1).unwrap(); + self.audio_ring_buffer.producer().push(samples.0).unwrap(); + self.audio_ring_buffer.producer().push(samples.1).unwrap(); } } @@ -170,7 +170,7 @@ impl Emulator { pub fn collect_audio_samples(&self) -> Result { let mut interface = self.interface.borrow_mut(); - let consumer = &mut interface.audio_ring_buffer.cons; + let consumer = interface.audio_ring_buffer.consumer(); let mut samples = Vec::with_capacity(consumer.len()); while let Some(sample) = consumer.pop() { samples.push(convert_sample(sample));