From 55f6e8ec7daeb3d27d82410962ddeb734b7baee2 Mon Sep 17 00:00:00 2001 From: Justin Worthe Date: Sat, 3 Feb 2018 16:41:48 +0200 Subject: Renamed wasm interface file to reflect that it isn't just emscripten anymore --- src/emscripten_api.rs | 75 --------------------------------------------------- src/lib.rs | 2 +- src/wasm_api.rs | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 76 insertions(+), 76 deletions(-) delete mode 100644 src/emscripten_api.rs create mode 100644 src/wasm_api.rs diff --git a/src/emscripten_api.rs b/src/emscripten_api.rs deleted file mode 100644 index bb4dd45..0000000 --- a/src/emscripten_api.rs +++ /dev/null @@ -1,75 +0,0 @@ -use model::Model; -use signal::Signal; -use pitch::Pitch; - -use std::os::raw::c_char; -use std::os::raw::c_void; -use std::mem; -use std::ffi::CString; -use std::slice; -use std::f32; - -#[no_mangle] -pub extern "C" fn malloc(size: usize) -> *mut c_void { - let mut buf = Vec::with_capacity(size); - let ptr = buf.as_mut_ptr(); - mem::forget(buf); - return ptr as *mut c_void; -} - -#[no_mangle] -pub extern "C" fn free(ptr: *mut c_void, cap: usize) { - unsafe { - // after it's in scope, it can go out of scope in the normal - // RAII cleanup. - let _buf = Vec::from_raw_parts(ptr, 0, cap); - } -} - -#[no_mangle] -pub extern "C" fn free_str(ptr: *mut c_char) { - unsafe { - let _ = CString::from_raw(ptr); - } -} - -#[no_mangle] -pub extern "C" fn find_fundamental_frequency(signal_ptr: *const f32, signal_length: usize, sample_rate: f32) -> f32 { - let signal_slice = unsafe { - &slice::from_raw_parts(signal_ptr, signal_length) - }; - let signal = Signal::new(signal_slice, sample_rate); - let model = Model::from_signal(signal); - - model.pitch.map_or(f32::NAN, |p| p.hz) -} - -#[no_mangle] -pub extern "C" fn hz_to_cents_error(hz: f32) -> f32 { - let pitch = Pitch::new(hz); - pitch.cents_error() -} - -#[no_mangle] -pub extern "C" fn hz_to_pitch(hz: f32) -> *mut c_char { - let pitch = Pitch::new(hz); - CString::new(format!("{}", pitch)) - .unwrap() - .into_raw() -} - -#[no_mangle] -pub extern "C" fn correlation(signal_ptr: *mut f32, signal_length: usize, sample_rate: f32) { - let signal_slice = unsafe { - &slice::from_raw_parts(signal_ptr, signal_length) - }; - - let signal = Signal::new(signal_slice, sample_rate); - let model = Model::from_signal(signal); - - unsafe { - for (i, cor) in model.correlation.value.iter().enumerate() { - *signal_ptr.offset(i as isize) = *cor; - } - } -} diff --git a/src/lib.rs b/src/lib.rs index f778f3b..8b8b990 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -16,5 +16,5 @@ extern crate portaudio; pub mod audio; #[cfg(target_arch = "wasm32")] -pub mod emscripten_api; +pub mod wasm_api; diff --git a/src/wasm_api.rs b/src/wasm_api.rs new file mode 100644 index 0000000..bb4dd45 --- /dev/null +++ b/src/wasm_api.rs @@ -0,0 +1,75 @@ +use model::Model; +use signal::Signal; +use pitch::Pitch; + +use std::os::raw::c_char; +use std::os::raw::c_void; +use std::mem; +use std::ffi::CString; +use std::slice; +use std::f32; + +#[no_mangle] +pub extern "C" fn malloc(size: usize) -> *mut c_void { + let mut buf = Vec::with_capacity(size); + let ptr = buf.as_mut_ptr(); + mem::forget(buf); + return ptr as *mut c_void; +} + +#[no_mangle] +pub extern "C" fn free(ptr: *mut c_void, cap: usize) { + unsafe { + // after it's in scope, it can go out of scope in the normal + // RAII cleanup. + let _buf = Vec::from_raw_parts(ptr, 0, cap); + } +} + +#[no_mangle] +pub extern "C" fn free_str(ptr: *mut c_char) { + unsafe { + let _ = CString::from_raw(ptr); + } +} + +#[no_mangle] +pub extern "C" fn find_fundamental_frequency(signal_ptr: *const f32, signal_length: usize, sample_rate: f32) -> f32 { + let signal_slice = unsafe { + &slice::from_raw_parts(signal_ptr, signal_length) + }; + let signal = Signal::new(signal_slice, sample_rate); + let model = Model::from_signal(signal); + + model.pitch.map_or(f32::NAN, |p| p.hz) +} + +#[no_mangle] +pub extern "C" fn hz_to_cents_error(hz: f32) -> f32 { + let pitch = Pitch::new(hz); + pitch.cents_error() +} + +#[no_mangle] +pub extern "C" fn hz_to_pitch(hz: f32) -> *mut c_char { + let pitch = Pitch::new(hz); + CString::new(format!("{}", pitch)) + .unwrap() + .into_raw() +} + +#[no_mangle] +pub extern "C" fn correlation(signal_ptr: *mut f32, signal_length: usize, sample_rate: f32) { + let signal_slice = unsafe { + &slice::from_raw_parts(signal_ptr, signal_length) + }; + + let signal = Signal::new(signal_slice, sample_rate); + let model = Model::from_signal(signal); + + unsafe { + for (i, cor) in model.correlation.value.iter().enumerate() { + *signal_ptr.offset(i as isize) = *cor; + } + } +} -- cgit v1.2.3