From bf3bb74c157cb77b18e05d7ffbb7c19f692666f4 Mon Sep 17 00:00:00 2001 From: jan Date: Fri, 20 Dec 2024 12:54:00 +0100 Subject: [PATCH] Implemented the changes to play an audio sample from the buffer (Work in progress) --- Cargo.lock | 482 +++++++++++++++++++++++++++++++++++++- Cargo.toml | 4 +- README.md | 15 +- examples/sound_demo.svc16 | Bin 0 -> 111124 bytes specification/sketch.svg | 454 +++++++++++++++++++---------------- src/engine.rs | 30 ++- src/main.rs | 16 +- src/utils.rs | 44 ++++ 8 files changed, 825 insertions(+), 220 deletions(-) create mode 100644 examples/sound_demo.svc16 diff --git a/Cargo.lock b/Cargo.lock index ae95496..762a6ff 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -31,12 +31,43 @@ dependencies = [ "zerocopy", ] +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + [[package]] name = "allocator-api2" version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" +[[package]] +name = "alsa" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed7572b7ba83a31e20d1b48970ee402d2e3e0537dcfe0a3ff4d6eb7508617d43" +dependencies = [ + "alsa-sys", + "bitflags 2.6.0", + "cfg-if", + "libc", +] + +[[package]] +name = "alsa-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db8fee663d06c4e303404ef5f40488a53e062f89ba8bfed81f42325aafad1527" +dependencies = [ + "libc", + "pkg-config", +] + [[package]] name = "android-activity" version = "0.5.2" @@ -176,6 +207,20 @@ dependencies = [ "libloading 0.7.4", ] +[[package]] +name = "asio-sys" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb111d0b927c4b860b42a8bd869b94f5f973b0395ed5892f1ab2be2dc6831ea8" +dependencies = [ + "bindgen 0.69.5", + "cc", + "num-derive", + "num-traits", + "parse_cfg", + "walkdir", +] + [[package]] name = "atomic-waker" version = "1.1.2" @@ -188,6 +233,47 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" +[[package]] +name = "bindgen" +version = "0.69.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" +dependencies = [ + "bitflags 2.6.0", + "cexpr", + "clang-sys", + "itertools 0.12.1", + "lazy_static", + "lazycell", + "log", + "prettyplease", + "proc-macro2", + "quote", + "regex", + "rustc-hash", + "shlex", + "syn 2.0.87", + "which", +] + +[[package]] +name = "bindgen" +version = "0.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f49d8fed880d473ea71efb9bf597651e77201bdd4893efe54c9e5d65ae04ce6f" +dependencies = [ + "bitflags 2.6.0", + "cexpr", + "clang-sys", + "itertools 0.13.0", + "proc-macro2", + "quote", + "regex", + "rustc-hash", + "shlex", + "syn 2.0.87", +] + [[package]] name = "bit-set" version = "0.5.3" @@ -261,6 +347,12 @@ version = "1.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b37c88a63ffd85d15b406896cc343916d7cf57838a847b3a6f2ca5d39a5695a" +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + [[package]] name = "bytes" version = "1.9.0" @@ -336,6 +428,15 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" +[[package]] +name = "cexpr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom", +] + [[package]] name = "cfg-if" version = "1.0.0" @@ -354,6 +455,17 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +[[package]] +name = "clang-sys" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" +dependencies = [ + "glob", + "libc", + "libloading 0.8.5", +] + [[package]] name = "clap" version = "4.5.21" @@ -394,6 +506,12 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "afb84c814227b90d6895e01398aee0d8033c00e7466aca416fb6a8e0eb19d8a7" +[[package]] +name = "claxon" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bfbf56724aa9eca8afa4fcfadeb479e722935bb2a0900c2d37e0cc477af0688" + [[package]] name = "codespan-reporting" version = "0.11.1" @@ -510,6 +628,51 @@ dependencies = [ "libc", ] +[[package]] +name = "coreaudio-rs" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "321077172d79c662f64f5071a03120748d5bb652f5231570141be24cfcd2bace" +dependencies = [ + "bitflags 1.3.2", + "core-foundation-sys", + "coreaudio-sys", +] + +[[package]] +name = "coreaudio-sys" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ce857aa0b77d77287acc1ac3e37a05a8c95a2af3647d23b15f263bdaeb7562b" +dependencies = [ + "bindgen 0.70.1", +] + +[[package]] +name = "cpal" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "873dab07c8f743075e57f524c583985fbaf745602acbe916a01539364369a779" +dependencies = [ + "alsa", + "asio-sys", + "core-foundation-sys", + "coreaudio-rs", + "dasp_sample", + "jni", + "js-sys", + "libc", + "mach2", + "ndk 0.8.0", + "ndk-context", + "num-traits", + "oboe", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows 0.54.0", +] + [[package]] name = "crossbeam-utils" version = "0.8.21" @@ -533,6 +696,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "dasp_sample" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c87e182de0887fd5361989c677c4e8f5000cd9491d6d563161a8f3a5519fc7f" + [[package]] name = "dispatch" version = "0.2.0" @@ -560,6 +729,21 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f25c0e292a7ca6d6498557ff1df68f32c99850012b6ea401cf8daf771f22ff53" +[[package]] +name = "either" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" + +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + [[package]] name = "equivalent" version = "1.0.1" @@ -661,7 +845,7 @@ dependencies = [ "vec_map", "wasm-bindgen", "web-sys", - "windows", + "windows 0.54.0", ] [[package]] @@ -675,6 +859,12 @@ dependencies = [ "xml-rs", ] +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + [[package]] name = "glow" version = "0.13.1" @@ -725,7 +915,7 @@ dependencies = [ "presser", "thiserror 1.0.69", "winapi", - "windows", + "windows 0.52.0", ] [[package]] @@ -797,6 +987,21 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" +[[package]] +name = "home" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "hound" +version = "3.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62adaabb884c94955b19907d60019f4e145d091c75345379e70d1ee696f7854f" + [[package]] name = "icrate" version = "0.0.4" @@ -854,6 +1059,24 @@ version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + [[package]] name = "jni" version = "0.21.1" @@ -911,6 +1134,29 @@ version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "lazycell" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" + +[[package]] +name = "lewton" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "777b48df9aaab155475a83a7df3070395ea1ac6902f5cd062b8f2b028075c030" +dependencies = [ + "byteorder", + "ogg", + "tinyvec", +] + [[package]] name = "libc" version = "0.2.164" @@ -1028,6 +1274,12 @@ dependencies = [ "paste", ] +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + [[package]] name = "naga" version = "0.19.2" @@ -1114,6 +1366,27 @@ dependencies = [ "libc", ] +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + [[package]] name = "num-traits" version = "0.2.19" @@ -1382,6 +1655,38 @@ dependencies = [ "cc", ] +[[package]] +name = "oboe" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8b61bebd49e5d43f5f8cc7ee2891c16e0f41ec7954d36bcb6c14c5e0de867fb" +dependencies = [ + "jni", + "ndk 0.8.0", + "ndk-context", + "num-derive", + "num-traits", + "oboe-sys", +] + +[[package]] +name = "oboe-sys" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8bb09a4a2b1d668170cfe0a7d5bc103f8999fb316c98099b6a9939c9f2e79d" +dependencies = [ + "cc", +] + +[[package]] +name = "ogg" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6951b4e8bf21c8193da321bcce9c9dd2e13c858fe078bf9054a288b419ae5d6e" +dependencies = [ + "byteorder", +] + [[package]] name = "once_cell" version = "1.20.2" @@ -1429,6 +1734,15 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "parse_cfg" +version = "4.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "905787a434a2c721408e7c9a252e85f3d93ca0f118a5283022636c0e05a7ea49" +dependencies = [ + "nom", +] + [[package]] name = "paste" version = "1.0.15" @@ -1513,6 +1827,16 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8cf8e6a8aa66ce33f63993ffc4ea4271eb5b0530a9002db8455ea6050c77bfa" +[[package]] +name = "prettyplease" +version = "0.2.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479cf940fbbb3426c32c5d5176f62ad57549a0bb84773423ba8be9d089f5faba" +dependencies = [ + "proc-macro2", + "syn 2.0.87", +] + [[package]] name = "proc-macro-crate" version = "3.2.0" @@ -1594,12 +1918,55 @@ dependencies = [ "bitflags 2.6.0", ] +[[package]] +name = "regex" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + [[package]] name = "renderdoc-sys" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" +[[package]] +name = "rodio" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6006a627c1a38d37f3d3a85c6575418cfe34a5392d60a686d0071e1c8d427acb" +dependencies = [ + "claxon", + "cpal", + "hound", + "lewton", + "symphonia", + "thiserror 1.0.69", +] + [[package]] name = "rustc-hash" version = "1.1.0" @@ -1813,18 +2180,69 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "svc16" -version = "0.5.0" +version = "0.6.0" dependencies = [ "anyhow", "clap", + "cpal", "gilrs", "pixels", + "rodio", "thiserror 2.0.3", "winit 0.29.15", "winit-input-map", "winit_input_helper", ] +[[package]] +name = "symphonia" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "815c942ae7ee74737bb00f965fa5b5a2ac2ce7b6c01c0cc169bbeaf7abd5f5a9" +dependencies = [ + "lazy_static", + "symphonia-bundle-mp3", + "symphonia-core", + "symphonia-metadata", +] + +[[package]] +name = "symphonia-bundle-mp3" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c01c2aae70f0f1fb096b6f0ff112a930b1fb3626178fba3ae68b09dce71706d4" +dependencies = [ + "lazy_static", + "log", + "symphonia-core", + "symphonia-metadata", +] + +[[package]] +name = "symphonia-core" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "798306779e3dc7d5231bd5691f5a813496dc79d3f56bf82e25789f2094e022c3" +dependencies = [ + "arrayvec", + "bitflags 1.3.2", + "bytemuck", + "lazy_static", + "log", +] + +[[package]] +name = "symphonia-metadata" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc622b9841a10089c5b18e99eb904f4341615d5aa55bbf4eedde1be721a4023c" +dependencies = [ + "encoding_rs", + "lazy_static", + "log", + "symphonia-core", +] + [[package]] name = "syn" version = "1.0.109" @@ -1921,6 +2339,21 @@ dependencies = [ "strict-num", ] +[[package]] +name = "tinyvec" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + [[package]] name = "toml_datetime" version = "0.6.8" @@ -2384,6 +2817,18 @@ dependencies = [ "web-sys", ] +[[package]] +name = "which" +version = "4.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" +dependencies = [ + "either", + "home", + "once_cell", + "rustix", +] + [[package]] name = "wide" version = "0.7.30" @@ -2437,7 +2882,17 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" dependencies = [ - "windows-core", + "windows-core 0.52.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows" +version = "0.54.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9252e5725dbed82865af151df558e754e4a3c2c30818359eb17465f1346a1b49" +dependencies = [ + "windows-core 0.54.0", "windows-targets 0.52.6", ] @@ -2450,6 +2905,25 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "windows-core" +version = "0.54.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12661b9c89351d684a50a8a643ce5f608e20243b9fb84687800163429f161d65" +dependencies = [ + "windows-result", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-result" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" +dependencies = [ + "windows-targets 0.52.6", +] + [[package]] name = "windows-sys" version = "0.45.0" diff --git a/Cargo.toml b/Cargo.toml index 9bceb05..f2d8de2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "svc16" -version = "0.5.0" +version = "0.6.0" edition = "2021" authors = ["Jan Neuendorf"] description = "An emulator for a simple virtual computer" @@ -9,9 +9,11 @@ license="MIT" [dependencies] anyhow = "1.0.93" clap = { version = "4.5.21", features = ["derive"] } +cpal = { version = "0.15.3", features = ["asio"] } gilrs = { version = "0.11.0"} # There seems to be some incompatibility with the latest crates.io version of pixels? pixels = { git = "https://github.com/parasyte/pixels.git", rev = "d4df286"} +rodio = "0.19.0" thiserror = "2.0.3" winit = "0.29.15" winit-input-map = "0.4.1" diff --git a/README.md b/README.md index ec5f017..8bdc635 100644 --- a/README.md +++ b/README.md @@ -66,6 +66,13 @@ The instruction pointer represents an address in main memory. It starts as zero. The screen has a resolution of $256*256=2^{16}$ pixels. The color of each pixel is represented with 16-bits using `RGB565`. The coordinate $(x,y)$ of the screen maps to the index $256y+x$ in the screen-buffer. The coordinate $(0,0)$ is in the upper left-hand corner. Changes to the screen-buffer are not reflected on the screen until the system is synchronized. +### Sound + +The system can play a sample from a sound buffer. +There is only one channel, so if a new sample is dispatched any that are currently playing are stopped. +The audio is represented with a sampling rate of 16 kHz. Each sample being, once again a u16. +The amplitude of the signal is given as:`amplitude=(float(sample) - 32768.0) / 32768.0`. + ### Input
@@ -127,11 +134,13 @@ When the instruction pointer advances, it does so by four positions. | 8 | **Deref** | yes | `@arg2=@(@arg1+arg3)` | | 9 | **Ref** | yes | `@(@arg1+arg3)=@arg2` | | 10 | **Inst** | yes | `@arg1=inst_ptr` | -| 11 | **Print** | yes | Writes `color=@arg1` to `index=@arg2` of screen-buffer. | -| 12 | **Read** | yes | Copies `index=@arg1` of screen-buffer to `@arg2` | +| 11 | **Print** | yes | Writes `color=@arg1` to `index=@arg2` of buffer arg3 | +| 12 | **Read** | yes | Copies `index=@arg1` of buffer arg3 to `@arg2` | | 13 | **Band** | yes | `@arg3=@arg1&@arg2` | | 14 | **Xor** | yes | `@arg3=@arg1^@arg2` | -| 15 | **Sync** | yes | Puts `@arg1=position_code`, `@arg2=key_code` and synchronizes in that order | +| 15 | **Sync** | yes | Puts `@arg1=position_code`, `@arg2=key_code` and synchronizes in that order if @arg3, it plays @arg3 values of the sound buffer. | + +When an argument refers to the name of a buffer, it means the screen buffer if it is 0 and the sound buffer otherwise. ### Constructing a Program diff --git a/examples/sound_demo.svc16 b/examples/sound_demo.svc16 new file mode 100644 index 0000000000000000000000000000000000000000..7f870e46eadaf1ade472981a2df2d7d8f0618d80 GIT binary patch literal 111124 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

W(4lA%L?Az2aK-NeNIieOl=m|q%0DlTjLrK^Tp;&T`qdUxI42EKl8i!481LOFL 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 + - - - - - - + + + Screen - - - - - - - - - - - - - - - - 16 - Screen-buffer - Sync - Input - 256px - 256px - Memory + dx="0" + dy="0">Screen + + d="m 41.595644,76.756889 h -1.584325 v -0.333375 l 0.568325,-0.574675 q 0.17145,-0.1778 0.276225,-0.295275 0.104775,-0.12065 0.1524,-0.2159 0.04763,-0.09843 0.04763,-0.20955 0,-0.136525 -0.0762,-0.2032 -0.07303,-0.06668 -0.200025,-0.06668 -0.130175,0 -0.254,0.06033 -0.123825,0.06032 -0.26035,0.17145 l -0.26035,-0.307975 q 0.09842,-0.08572 0.206375,-0.15875 0.111125,-0.07303 0.254,-0.117475 0.14605,-0.04762 0.34925,-0.04762 0.22225,0 0.381,0.08255 0.161925,0.07937 0.24765,0.219075 0.0889,0.136525 0.0889,0.31115 0,0.187325 -0.0762,0.3429 -0.07303,0.155575 -0.2159,0.307975 -0.1397,0.1524 -0.339725,0.33655 l -0.2921,0.27305 v 0.02222 h 0.987425 z" + style="font-weight:bold;font-family:'Fira Mono';-inkscape-font-specification:'Fira Mono Bold';fill:#000000;stroke:none;stroke-width:0.35" + id="path300" /> - Instruction-pointer - + d="m 46.313699,76.756889 h -0.479425 v -1.311275 q 0,-0.08255 0.0032,-0.2159 0.0063,-0.13335 0.0095,-0.23495 -0.01588,0.01905 -0.06985,0.06985 -0.0508,0.04762 -0.09525,0.08572 l -0.26035,0.20955 -0.231775,-0.288925 0.73025,-0.581025 h 0.3937 z" + style="font-weight:bold;font-family:'Fira Mono';-inkscape-font-specification:'Fira Mono Bold';fill:#000000;stroke:none;stroke-width:0.35" + id="path302" /> - - + d="m 46.92965,75.794864 q 0,-0.19685 0.02857,-0.38735 0.02858,-0.1905 0.09842,-0.358775 0.07303,-0.17145 0.200025,-0.301625 0.130175,-0.13335 0.327025,-0.206375 0.200025,-0.0762 0.4826,-0.0762 0.06668,0 0.155575,0.0063 0.0889,0.0032 0.149225,0.01587 v 0.384175 q -0.06032,-0.01588 -0.13335,-0.02223 -0.06985,-0.0095 -0.1397,-0.0095 -0.282575,0 -0.43815,0.0889 -0.1524,0.0889 -0.2159,0.250825 -0.0635,0.15875 -0.07303,0.3683 h 0.01905 q 0.0635,-0.111125 0.180975,-0.187325 0.12065,-0.0762 0.31115,-0.0762 0.29845,0 0.473075,0.187325 0.174625,0.187325 0.174625,0.530225 0,0.3683 -0.20955,0.57785 -0.206375,0.20955 -0.561975,0.20955 -0.231775,0 -0.4191,-0.104775 -0.187325,-0.10795 -0.29845,-0.327025 -0.111125,-0.22225 -0.111125,-0.561975 z m 0.81915,0.6096 q 0.1397,0 0.2286,-0.09525 0.0889,-0.09842 0.0889,-0.301625 0,-0.1651 -0.0762,-0.26035 -0.0762,-0.09525 -0.231775,-0.09525 -0.104775,0 -0.18415,0.04762 -0.07937,0.04445 -0.123825,0.117475 -0.04445,0.07303 -0.04445,0.149225 0,0.104775 0.0381,0.206375 0.0381,0.09842 0.1143,0.1651 0.07937,0.06668 0.1905,0.06668 z" + style="font-weight:bold;font-family:'Fira Mono';-inkscape-font-specification:'Fira Mono Bold';fill:#000000;stroke:none;stroke-width:0.35" + id="path304" /> + + + + + + + + + + + 16 + Screen-buffer + Sync + Input + 256px + 256px + Memory + + + Instruction-pointer + + + + + + Sound-buffer + diff --git a/src/engine.rs b/src/engine.rs index 6ef09c7..e4c0479 100644 --- a/src/engine.rs +++ b/src/engine.rs @@ -23,10 +23,12 @@ const SYNC: u16 = 15; pub struct Engine { memory: [u16; MEMSIZE], screen: [u16; MEMSIZE], + sound: [u16; MEMSIZE], instruction_pointer: u16, pos_code: u16, key_code: u16, sync_called: bool, + sound_code: u16, } #[derive(Debug, Error)] @@ -58,10 +60,12 @@ impl Engine { Self { memory, screen: [0; MEMSIZE], + sound: [0; MEMSIZE], instruction_pointer: 0, pos_code: 0, key_code: 0, sync_called: false, + sound_code: 0, } } pub fn wants_to_sync(&self) -> bool { @@ -76,10 +80,15 @@ impl Engine { pos_code: u16, key_code: u16, buffer: &mut [u16; MEMSIZE], - ) -> () { + ) -> Option> { self.set_input(pos_code, key_code); self.sync_called = false; *buffer = self.screen; + if self.sound_code == 0 { + return None; + } else { + return Some(self.sound[..self.sound_code as usize].to_vec()); + } } } impl Engine { @@ -92,9 +101,15 @@ impl Engine { fn get_screen(&self, index: u16) -> u16 { return self.screen[index as usize]; } + fn get_sound(&self, index: u16) -> u16 { + return self.sound[index as usize]; + } fn set_screen(&mut self, index: u16, value: u16) { self.screen[index as usize] = value; } + fn set_sound(&mut self, index: u16, value: u16) { + self.sound[index as usize] = value; + } pub fn read_instruction(&self) -> [u16; 4] { return [0, 1, 2, 3].map(|o| self.get(self.instruction_pointer.wrapping_add(o))); } @@ -168,11 +183,19 @@ impl Engine { self.advance_inst_ptr(); } PRINT => { - self.set_screen(self.get(arg2), self.get(arg1)); + if arg3 == 0 { + self.set_screen(self.get(arg2), self.get(arg1)); + } else { + self.set_sound(self.get(arg2), self.get(arg1)); + } self.advance_inst_ptr(); } READ => { - self.set(arg2, self.get_screen(self.get(arg1))); + if arg3 == 0 { + self.set(arg2, self.get_screen(self.get(arg1))); + } else { + self.set(arg2, self.get_sound(self.get(arg1))); + } self.advance_inst_ptr(); } BAND => { @@ -189,6 +212,7 @@ impl Engine { self.sync_called = true; self.set(arg1, self.pos_code); self.set(arg2, self.key_code); + self.sound_code = self.get(arg3); self.advance_inst_ptr(); } _ => return Err(EngineError::InvalidInstruction), diff --git a/src/main.rs b/src/main.rs index 6b26d4a..ffae1d7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -8,6 +8,8 @@ use cli::Cli; use engine::Engine; use gilrs::Gilrs; use pixels::{Pixels, SurfaceTexture}; +use rodio::{source::Source, Decoder, OutputStream, Sink}; +use std::any::Any; use std::time::{Duration, Instant}; use utils::*; use winit::dpi::LogicalSize; @@ -28,6 +30,8 @@ fn main() -> Result<()> { let event_loop = EventLoop::new()?; let mut input = WinitInputHelper::new(); let mut gamepad = build_gamepad_map(); + let (audio_strem, audio_player) = rodio::OutputStream::try_default()?; + let audio_sink = Sink::try_new(&audio_player)?; if cli.scaling < 1 { return Err(anyhow!("The minimal scaling factor is 1")); } @@ -67,12 +71,15 @@ fn main() -> Result<()> { paused = !paused; if paused { window.set_title("SVC16 (paused)"); + audio_sink.pause(); } else { window.set_title("SVC16"); + audio_sink.play(); } } if input.key_pressed_logical(Key::Character("r")) { engine = Engine::new(initial_state.clone()); + audio_sink.clear(); paused = false; } @@ -98,7 +105,14 @@ fn main() -> Result<()> { let engine_elapsed = engine_start.elapsed(); gamepad.update_with_gilrs(&mut girls); let (c1, c2) = get_input_code(&input, &gamepad, &pixels); - engine.perform_sync(c1, c2, &mut raw_buffer); + let sound_request = engine.perform_sync(c1, c2, &mut raw_buffer); + if let Some(audio) = sound_request { + dbg!(&audio); + let source = SoundFormat::new(audio); + audio_sink.clear(); + audio_sink.append(source); + audio_sink.play(); + } update_image_buffer(pixels.frame_mut(), &raw_buffer); let elapsed = start_time.elapsed(); diff --git a/src/utils.rs b/src/utils.rs index 6a0c631..daae309 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -1,6 +1,7 @@ use crate::RES; use anyhow::Result; use pixels::Pixels; +use rodio::Source; use std::hash::Hash; use winit::{ event::MouseButton, @@ -129,3 +130,46 @@ pub fn handle_event_loop_error(handle: &EventLoopWindowTarget<()>, msg: impl AsR eprintln!("{}", msg.as_ref()); handle.exit(); } + +pub struct SoundFormat { + samples: Vec, + current: usize, +} + +impl SoundFormat { + pub fn new(vec: Vec) -> Self { + Self { + samples: vec, + current: 0, + } + } +} +impl Iterator for SoundFormat { + type Item = f32; + + fn next(&mut self) -> Option { + let val = self + .samples + .get(self.current) + .map(|v| (*v as f32 - 32768.0) / 32768.0); + self.current += 1; + val + } +} +impl Source for SoundFormat { + fn current_frame_len(&self) -> Option { + None + } + + fn channels(&self) -> u16 { + 1 + } + + fn sample_rate(&self) -> u32 { + 16000 + } + + fn total_duration(&self) -> Option { + None + } +}