diff options
author | Justin Worthe <justin@worthe-it.co.za> | 2017-09-24 23:03:39 +0200 |
---|---|---|
committer | Justin Worthe <justin@worthe-it.co.za> | 2017-09-24 23:03:39 +0200 |
commit | f3a4cc60d71a0083586b5498fd2498801a634d04 (patch) | |
tree | afe607b84ce474dc75952b70c4a64e686039dc9b | |
parent | 3f5fb1cc3de97244548538ec81dda3963f1b25c6 (diff) |
Emscripten endpoint for finding fundamental frequency
IT'S ALIVE!
-rw-r--r-- | .gitignore | 5 | ||||
-rwxr-xr-x | make-web.sh | 11 | ||||
-rw-r--r-- | src/transforms.rs | 16 | ||||
-rw-r--r-- | web/index.html | 7 | ||||
-rw-r--r-- | web/main.js | 25 |
5 files changed, 64 insertions, 0 deletions
@@ -1 +1,6 @@ target +/web/rusty_microphone.js +/web/rusty_microphone-*.wasm +/web/rusty_microphone-*.wast +/web/rusty_microphone-*.js +/web/rusty_microphone-*.map diff --git a/make-web.sh b/make-web.sh new file mode 100755 index 0000000..4237e13 --- /dev/null +++ b/make-web.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +DIR="$(dirname "$0")" + +if cargo build --target=wasm32-unknown-emscripten; then + cp $DIR/target/wasm32-unknown-emscripten/debug/rusty_microphone.js "$DIR/web/" + cp $DIR/target/wasm32-unknown-emscripten/debug/deps/*.wasm "$DIR/web/" + cp $DIR/target/wasm32-unknown-emscripten/debug/deps/*.wast "$DIR/web/" + cp $DIR/target/wasm32-unknown-emscripten/debug/deps/*.map "$DIR/web/" + cp $DIR/target/wasm32-unknown-emscripten/debug/deps/*.js "$DIR/web/" +fi diff --git a/src/transforms.rs b/src/transforms.rs index 55f81b6..656255b 100644 --- a/src/transforms.rs +++ b/src/transforms.rs @@ -236,3 +236,19 @@ pub fn align_to_rising_edge(samples: &[f32]) -> Vec<f32> { .cloned() .collect() } + + +#[cfg(target_os = "emscripten")] +pub mod emscripten_api { + #[no_mangle] + pub extern "C" fn find_fundamental_frequency(signal: *const f32, signal_length: isize, sample_rate: f32) -> f32 { + use std::slice; + let signal_slice = unsafe { + &slice::from_raw_parts(signal, signal_length as usize) + }; + + println!("Signal is {:?}", signal_slice); + println!("Sample rate is {:?}Hz", sample_rate); + super::find_fundamental_frequency(&signal_slice, sample_rate).unwrap_or(0.0) + } +} diff --git a/web/index.html b/web/index.html new file mode 100644 index 0000000..f70f24b --- /dev/null +++ b/web/index.html @@ -0,0 +1,7 @@ +<html> + <head> + <script src="main.js"></script> + <script src="rusty_microphone.js"></script> + </head> + <body></body> +</html> diff --git a/web/main.js b/web/main.js new file mode 100644 index 0000000..b01340d --- /dev/null +++ b/web/main.js @@ -0,0 +1,25 @@ +// This is read and used by `site.js` +var Module = { + noInitialRun: true, + noExitRuntime: true, + onRuntimeInitialized: main +}; + +function jsArrayToF32ArrayPtr(jsArray) { + var data = new Float32Array(jsArray); + var nDataBytes = data.length * data.BYTES_PER_ELEMENT; + var dataPtr = Module._malloc(nDataBytes); + + var dataHeap = new Uint8Array(Module.HEAPU8.buffer, dataPtr, nDataBytes); + dataHeap.set(new Uint8Array(data.buffer)); + return dataHeap.byteOffset; +} + +function main() { + var data = [1, 0, -1, 0, 1, 0, -1, 0, 1, 0, -1, 0, 1, 0, -1, 0]; + var dataLength = data.length; + var ptr = jsArrayToF32ArrayPtr(data); + + var fundamental = _find_fundamental_frequency(ptr, data.length, 44100.0); + console.log("Javascript here. Our fundamental frequency according to Rust is " + fundamental + "Hz"); +} |