From cdd1ff2cbf2f4d9aa2927e40324da96817cca247 Mon Sep 17 00:00:00 2001 From: Skyler Lehmkuhl Date: Sat, 25 Jan 2025 05:39:57 -0500 Subject: [PATCH] sound is playing! --- lightningbeam-core/src/audio.rs | 22 +- lightningbeam-core/src/lib.rs | 288 ++++++----- src/main.js | 13 + src/pkg/lightningbeam_core.d.ts | 66 +++ src/pkg/lightningbeam_core.js | 655 ++++++++++++++++++++++++ src/pkg/lightningbeam_core_bg.wasm | Bin 0 -> 135753 bytes src/pkg/lightningbeam_core_bg.wasm.d.ts | 23 + src/pkg/package.json | 14 + 8 files changed, 952 insertions(+), 129 deletions(-) create mode 100644 src/pkg/lightningbeam_core.d.ts create mode 100644 src/pkg/lightningbeam_core.js create mode 100644 src/pkg/lightningbeam_core_bg.wasm create mode 100644 src/pkg/lightningbeam_core_bg.wasm.d.ts create mode 100644 src/pkg/package.json diff --git a/lightningbeam-core/src/audio.rs b/lightningbeam-core/src/audio.rs index 4166a88..9dc806f 100644 --- a/lightningbeam-core/src/audio.rs +++ b/lightningbeam-core/src/audio.rs @@ -1,5 +1,5 @@ use cpal::traits::{DeviceTrait, HostTrait, StreamTrait}; -use cpal::{Sample, SampleFormat, StreamConfig, SupportedBufferSize, SampleRate, BufferSize}; +use cpal::{Sample}; use std::sync::{Arc, Mutex}; use crate::{TrackManager, Timestamp, Duration, SampleCount, AudioOutput, PlaybackState}; @@ -44,15 +44,29 @@ where self.sample_rate = supported_config.sample_rate.0; let num_channels = supported_config.channels as usize; // Get channel count + let buffer_size_range = match config.buffer_size() { + cpal::SupportedBufferSize::Range { min, max } => (*min, *max), + cpal::SupportedBufferSize::Unknown => { + // Use a reasonable default range if the device doesn't specify + (256, 4096) + } + }; + + // Define the desired buffer size and clamp it to the supported range + let desired_buffer_size = 2048; + let clamped_buffer_size = desired_buffer_size.clamp(buffer_size_range.0, buffer_size_range.1); + + let mut stream_config = supported_config.clone(); + stream_config.buffer_size = cpal::BufferSize::Fixed(clamped_buffer_size); + let track_manager = self.track_manager.clone(); - let playback_state = self.playback_state.clone(); let timestamp = self.timestamp.clone(); let sample_rate = self.sample_rate; let err_fn = |err| eprintln!("Audio stream error: {:?}", err); let stream = device.build_output_stream( - &supported_config, + &stream_config, move |data: &mut [T], _: &cpal::OutputCallbackInfo| { if let Some(track_manager) = &track_manager { let num_frames = data.len() / num_channels; // Stereo: divide by 2 @@ -60,14 +74,12 @@ where let chunk_duration = Duration::new(num_frames as f64 / sample_rate as f64); let mut track_manager = track_manager.lock().unwrap(); - let playing = matches!(playback_state, PlaybackState::Playing); let mut timestamp_guard = timestamp.lock().unwrap(); let timestamp = &mut *timestamp_guard; let chunk = track_manager.update_audio( timestamp.clone(), - playing, sample_count, sample_rate, ); diff --git a/lightningbeam-core/src/lib.rs b/lightningbeam-core/src/lib.rs index 0912adc..b99a592 100644 --- a/lightningbeam-core/src/lib.rs +++ b/lightningbeam-core/src/lib.rs @@ -5,112 +5,89 @@ use audio::{CpalAudioOutput}; use log::{Level, LevelFilter, Log, Metadata, Record, SetLoggerError}; use std::sync::{Arc, Mutex}; +use std::fmt; #[cfg(feature = "wasm")] mod wasm_imports { - pub use wasm_bindgen::prelude::*; - pub use web_sys::console; - use wasm_logger; + pub use wasm_bindgen::prelude::*; + pub use web_sys::console; } #[cfg(feature = "wasm")] use wasm_imports::*; -pub trait AudioTrack: Send { - /// Render a chunk of audio for the given timestamp and duration. - fn render_chunk(&mut self, timestamp: Timestamp, duration: SampleCount) -> Vec; +pub trait Track: Send { + fn get_name(&self) -> &str { + "Unnamed Track" + } - /// Get the sample rate of the audio track. - fn sample_rate(&self) -> u32; -} - -pub trait VideoTrack: Send { - /// Render a frame for the given timestamp. - fn render_frame(&self, timestamp: Timestamp) -> Frame; - - /// Get the frame rate of the video track. - fn frame_rate(&self) -> f64; + fn set_name(&mut self, _name: String) { + } + /// Render audio for the given timestamp and duration. + /// Returns `None` if this track doesn't produce audio. + fn render_audio(&mut self, _timestamp: Timestamp, _duration: SampleCount, _sample_rate: u32, _playing: bool) -> Option> { + None + } + + /// Render a video frame for the given timestamp. + /// Returns `None` if this track doesn't produce video. + fn render_video(&self, _timestamp: Timestamp, _playing: bool) -> Option { + None + } } pub struct TrackManager { - audio_tracks: Vec>, - video_tracks: Vec>, - // sample_rate: u32, - // frame_duration: Duration, // Duration of each frame in seconds (e.g., 1/60 for 60 FPS) + tracks: Vec>, timestamp: Timestamp, playback_state: PlaybackState, } impl TrackManager { - pub fn new(sample_rate: u32, frame_duration: f64) -> Self { + pub fn new() -> Self { Self { - audio_tracks: Vec::new(), - video_tracks: Vec::new(), - // sample_rate, - // frame_duration: Duration::new(frame_duration), - playback_state: PlaybackState::Stopped, + tracks: Vec::new(), timestamp: Timestamp::from_seconds(0.0), + playback_state: PlaybackState::Stopped, } } - pub fn add_audio_track(&mut self, track: Box) { - self.audio_tracks.push(track); + pub fn add_track(&mut self, track: Box) { + self.tracks.push(track); } - pub fn add_video_track(&mut self, track: Box) { - self.video_tracks.push(track); + pub fn update_audio(&mut self, timestamp: Timestamp, chunk_size: SampleCount, sample_rate: u32) -> Vec { + + let mut mixed = vec![0.0; chunk_size.as_usize()]; + let playing = matches!(self.playback_state, PlaybackState::Playing); + + for track in &mut self.tracks { + if let Some(samples) = track.render_audio(timestamp, chunk_size, sample_rate, playing) { + for (i, sample) in samples.iter().enumerate() { + mixed[i] += *sample; + } + } + } + + mixed } - + + pub fn update_video(&self, timestamp: Timestamp) -> Vec { + let playing = matches!(self.playback_state, PlaybackState::Playing); + self.tracks + .iter() + .filter_map(|track| track.render_video(timestamp, playing)) + .collect() + } + pub fn play(&mut self, start_timestamp: Timestamp) { self.timestamp = start_timestamp; self.playback_state = PlaybackState::Playing; } - pub fn stop(&mut self) { - self.playback_state = PlaybackState::Stopped; + self.playback_state = PlaybackState::Stopped; } - - // pub fn play(&mut self, timestamp: Timestamp, audio_output: &mut dyn AudioOutput, video_output: &mut dyn FrameTarget) { - // let mut timestamp = timestamp.clone(); - - // // Main playback loop - // loop { - // // Render and play audio chunks - // let mut audio_mix: Vec = vec![0.0; self.frame_duration.to_samples(self.sample_rate) as usize]; - // for track in &mut self.audio_tracks { - // let chunk = track.render_chunk(timestamp, self.frame_duration); - // for (i, sample) in chunk.iter().enumerate() { - // audio_mix[i] += sample; // Simple mixing (sum of samples) - // } - // } - // audio_output.play_chunk(audio_mix); - - // // Render video frames - // for track in &self.video_tracks { - // let track_frame = track.render_frame(timestamp); - // } - - // // Update timestamp - // timestamp += self.frame_duration; - - // // Break condition (e.g., end of tracks) - // if self.audio_tracks.iter().all(|t| t.render_chunk(timestamp, self.frame_duration).is_empty()) { - // break; - // } - // } - // } - pub fn update_audio(&mut self, timestamp: Timestamp, playing: bool, chunk_size: SampleCount, sample_rate: u32) -> Vec { - let mut mixed_audio = vec![0.0; chunk_size.as_usize()]; - - // TODO: render video - for track in &mut self.audio_tracks { - let track_audio = track.render_chunk(timestamp, chunk_size); - for (i, sample) in track_audio.iter().enumerate() { - mixed_audio[i] += *sample; // Simple mixing, add samples together - } - } - - mixed_audio + pub fn get_tracks(&self) -> &Vec> { + &self.tracks } } @@ -136,39 +113,75 @@ enum PlaybackState { pub struct SineWaveTrack { frequency: f32, phase: f32, - sample_rate: u32, + name: String, } impl SineWaveTrack { - pub fn new(frequency: f32, sample_rate: u32) -> Self { + pub fn new(frequency: f32) -> Self { Self { frequency, phase: 0.0, - sample_rate, + name: "Sine Wave Track".to_string(), } } } -impl AudioTrack for SineWaveTrack { - fn render_chunk(&mut self, timestamp: Timestamp, chunk_size: SampleCount) -> Vec { +impl Track for SineWaveTrack { + fn get_name(&self) -> &str { + &self.name + } + fn set_name(&mut self, name: String) { + self.name = name; + } + fn render_audio(&mut self, _timestamp: Timestamp, chunk_size: SampleCount, sample_rate: u32, playing: bool) -> Option> { let mut chunk = Vec::with_capacity(chunk_size.as_usize()); - let phase_increment = (2.0 * std::f32::consts::PI * self.frequency) / self.sample_rate as f32; - + let phase_increment = (2.0 * std::f32::consts::PI * self.frequency) / sample_rate as f32; + for _ in 0..chunk_size.as_usize() { - chunk.push((self.phase).sin()); - self.phase += phase_increment; - if self.phase > 2.0 * std::f32::consts::PI { - self.phase -= 2.0 * std::f32::consts::PI; - } + if playing { + chunk.push((self.phase).sin()*0.25); + } else { + chunk.push(0.0); + } + self.phase += phase_increment; + if self.phase > 2.0 * std::f32::consts::PI { + self.phase -= 2.0 * std::f32::consts::PI; + } } - - chunk - } - fn sample_rate(&self) -> u32 { - self.sample_rate + + Some(chunk) } } +#[cfg(feature="wasm")] +#[wasm_bindgen] +pub struct JsTrack { + name: String, +} + +#[cfg(feature="wasm")] +#[wasm_bindgen] +impl JsTrack { + #[wasm_bindgen(getter)] + pub fn name(&self) -> String { + self.name.clone() + } +} +#[cfg(feature="wasm")] +impl fmt::Display for JsTrack { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "JsTrack {{ name: {} }}", self.name) + } +} + +#[cfg(feature="wasm")] +#[wasm_bindgen] +impl JsTrack { + #[wasm_bindgen(js_name = toString)] + pub fn to_string(&self) -> String { + format!("{}", self) // Calls the Display implementation + } +} #[cfg(feature="wasm")] #[wasm_bindgen] @@ -183,9 +196,9 @@ pub struct CoreInterface { #[wasm_bindgen] impl CoreInterface { #[wasm_bindgen(constructor)] - pub fn new(sample_rate: u32, frame_duration: f64) -> Self { + pub fn new() -> Self { Self { - track_manager: Arc::new(Mutex::new(TrackManager::new(sample_rate, frame_duration))), + track_manager: Arc::new(Mutex::new(TrackManager::new())), cpal_audio_output: Box::new(CpalAudioOutput::new()) } } @@ -193,45 +206,72 @@ impl CoreInterface { println!("Init CoreInterface"); let track_manager_clone = self.track_manager.clone(); self.cpal_audio_output.register_track_manager(track_manager_clone); - self.cpal_audio_output.start(); + let _ = self.cpal_audio_output.start(); } pub fn play(&mut self, timestamp: f64) { // Lock the Mutex to get access to TrackManager let mut track_manager = self.track_manager.lock().unwrap(); track_manager.play(Timestamp::new(timestamp)); } + pub fn stop(&mut self) { + // Lock the Mutex to get access to TrackManager + let mut track_manager = self.track_manager.lock().unwrap(); + track_manager.stop(); + } + pub fn add_sine_track(&mut self, frequency: f32) -> Result<(), String> { + if frequency.is_nan() || frequency.is_infinite() || frequency <= 0.0 { + return Err(format!("Invalid frequency: {}", frequency)); + } + log::info!("Freq: {}", frequency); + let mut track_manager = self.track_manager.lock().unwrap(); + let sine_track = SineWaveTrack::new(frequency); + track_manager.add_track(Box::new(sine_track)); + + Ok(()) + } + pub fn get_timestamp(&mut self) -> f64 { self.cpal_audio_output.get_timestamp().as_seconds() } + pub fn get_tracks(&mut self) -> Vec { + let track_manager = self.track_manager.lock().unwrap(); + let tracks = track_manager.get_tracks(); + tracks + .iter() + .map(|track| JsTrack { + name: track.get_name().to_string(), + }) + .collect() + } } struct PlainTextLogger; impl Log for PlainTextLogger { - fn enabled(&self, metadata: &Metadata) -> bool { - metadata.level() <= Level::Info + fn enabled(&self, metadata: &Metadata) -> bool { + metadata.level() <= Level::Info + } + + fn log(&self, record: &Record) { + if self.enabled(record.metadata()) { + console::log_1(&format!( + "{} [{}:{}] {}", + record.level(), + record.file().unwrap_or("unknown"), + record.line().unwrap_or(0), + record.args() + ).into()); } - - fn log(&self, record: &Record) { - if self.enabled(record.metadata()) { - console::log_1(&format!( - "{} [{}:{}] {}", - record.level(), - record.file().unwrap_or("unknown"), - record.line().unwrap_or(0), - record.args() - ).into()); - } - } - - fn flush(&self) {} + } + + fn flush(&self) {} } pub fn init_plain_text_logger() -> Result<(), SetLoggerError> { - log::set_boxed_logger(Box::new(PlainTextLogger))?; - log::set_max_level(LevelFilter::Info); - Ok(()) + log::set_boxed_logger(Box::new(PlainTextLogger))?; + log::set_max_level(LevelFilter::Info); + Ok(()) } #[cfg(test)] @@ -249,14 +289,14 @@ mod tests { #[cfg(feature="wasm")] #[wasm_bindgen(start)] pub fn main_js() -> Result<(), JsValue> { - // This provides better error messages in debug mode. - // It's disabled in release mode so it doesn't bloat up the file size. - #[cfg(debug_assertions)] - console_error_panic_hook::set_once(); - init_plain_text_logger().expect("Failed to initialize plain text logger"); - - - log::info!("Logger initialized!"); - - Ok(()) + // This provides better error messages in debug mode. + // It's disabled in release mode so it doesn't bloat up the file size. + #[cfg(debug_assertions)] + console_error_panic_hook::set_once(); + init_plain_text_logger().expect("Failed to initialize plain text logger"); + + + log::info!("Logger initialized!"); + + Ok(()) } \ No newline at end of file diff --git a/src/main.js b/src/main.js index 475b157..bb0bd79 100644 --- a/src/main.js +++ b/src/main.js @@ -78,6 +78,8 @@ const { Menu, MenuItem, PredefinedMenuItem, Submenu } = window.__TAURI__.menu; const { getCurrentWindow } = window.__TAURI__.window; const { getVersion } = window.__TAURI__.app; +import init, { CoreInterface } from './pkg/lightningbeam_core.js'; + window.onerror = (message, source, lineno, colno, error) => { invoke("error", { msg: `${message} at ${source}:${lineno}:${colno}\n${error?.stack || ''}` }); }; @@ -8408,3 +8410,14 @@ if (window.openedFiles?.length>0) { newWindow(window.openedFiles[i]) } } + +async function testAudio() { + console.log("Starting rust") + await init(); + console.log("Rust started") + const coreInterface = new CoreInterface(100, 100) + coreInterface.init() + coreInterface.play(0.0) + console.log(coreInterface) +} +testAudio() \ No newline at end of file diff --git a/src/pkg/lightningbeam_core.d.ts b/src/pkg/lightningbeam_core.d.ts new file mode 100644 index 0000000..87d6b82 --- /dev/null +++ b/src/pkg/lightningbeam_core.d.ts @@ -0,0 +1,66 @@ +/* tslint:disable */ +/* eslint-disable */ +export function main_js(): void; +export class CoreInterface { + free(): void; + constructor(); + init(): void; + play(timestamp: number): void; + stop(): void; + add_sine_track(frequency: number): void; + get_timestamp(): number; + get_tracks(): JsTrack[]; +} +export class JsTrack { + private constructor(); + free(): void; + toString(): string; + readonly name: string; +} + +export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module; + +export interface InitOutput { + readonly memory: WebAssembly.Memory; + readonly __wbg_jstrack_free: (a: number, b: number) => void; + readonly jstrack_name: (a: number, b: number) => void; + readonly jstrack_toString: (a: number, b: number) => void; + readonly __wbg_coreinterface_free: (a: number, b: number) => void; + readonly coreinterface_new: () => number; + readonly coreinterface_init: (a: number) => void; + readonly coreinterface_play: (a: number, b: number) => void; + readonly coreinterface_stop: (a: number) => void; + readonly coreinterface_add_sine_track: (a: number, b: number, c: number) => void; + readonly coreinterface_get_timestamp: (a: number) => number; + readonly coreinterface_get_tracks: (a: number, b: number) => void; + readonly main_js: () => void; + readonly __wbindgen_exn_store: (a: number) => void; + readonly __wbindgen_export_1: WebAssembly.Table; + readonly __wbindgen_malloc: (a: number, b: number) => number; + readonly __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number; + readonly __wbindgen_add_to_stack_pointer: (a: number) => number; + readonly __wbindgen_free: (a: number, b: number, c: number) => void; + readonly _dyn_core__ops__function__FnMut_____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h03a328ab39659ec3: (a: number, b: number) => void; + readonly __wbindgen_start: () => void; +} + +export type SyncInitInput = BufferSource | WebAssembly.Module; +/** +* Instantiates the given `module`, which can either be bytes or +* a precompiled `WebAssembly.Module`. +* +* @param {{ module: SyncInitInput }} module - Passing `SyncInitInput` directly is deprecated. +* +* @returns {InitOutput} +*/ +export function initSync(module: { module: SyncInitInput } | SyncInitInput): InitOutput; + +/** +* If `module_or_path` is {RequestInfo} or {URL}, makes a request and +* for everything else, calls `WebAssembly.instantiate` directly. +* +* @param {{ module_or_path: InitInput | Promise }} module_or_path - Passing `InitInput` directly is deprecated. +* +* @returns {Promise} +*/ +export default function __wbg_init (module_or_path?: { module_or_path: InitInput | Promise } | InitInput | Promise): Promise; diff --git a/src/pkg/lightningbeam_core.js b/src/pkg/lightningbeam_core.js new file mode 100644 index 0000000..0ef6268 --- /dev/null +++ b/src/pkg/lightningbeam_core.js @@ -0,0 +1,655 @@ +const lAudioContext = (typeof AudioContext !== 'undefined' ? AudioContext : (typeof webkitAudioContext !== 'undefined' ? webkitAudioContext : undefined)); +let wasm; + +const heap = new Array(128).fill(undefined); + +heap.push(undefined, null, true, false); + +function getObject(idx) { return heap[idx]; } + +let heap_next = heap.length; + +function addHeapObject(obj) { + if (heap_next === heap.length) heap.push(heap.length + 1); + const idx = heap_next; + heap_next = heap[idx]; + + heap[idx] = obj; + return idx; +} + +function handleError(f, args) { + try { + return f.apply(this, args); + } catch (e) { + wasm.__wbindgen_exn_store(addHeapObject(e)); + } +} + +let cachedFloat32ArrayMemory0 = null; + +function getFloat32ArrayMemory0() { + if (cachedFloat32ArrayMemory0 === null || cachedFloat32ArrayMemory0.byteLength === 0) { + cachedFloat32ArrayMemory0 = new Float32Array(wasm.memory.buffer); + } + return cachedFloat32ArrayMemory0; +} + +function getArrayF32FromWasm0(ptr, len) { + ptr = ptr >>> 0; + return getFloat32ArrayMemory0().subarray(ptr / 4, ptr / 4 + len); +} + +const cachedTextDecoder = (typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }) : { decode: () => { throw Error('TextDecoder not available') } } ); + +if (typeof TextDecoder !== 'undefined') { cachedTextDecoder.decode(); }; + +let cachedUint8ArrayMemory0 = null; + +function getUint8ArrayMemory0() { + if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) { + cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer); + } + return cachedUint8ArrayMemory0; +} + +function getStringFromWasm0(ptr, len) { + ptr = ptr >>> 0; + return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len)); +} + +function isLikeNone(x) { + return x === undefined || x === null; +} + +function dropObject(idx) { + if (idx < 132) return; + heap[idx] = heap_next; + heap_next = idx; +} + +function takeObject(idx) { + const ret = getObject(idx); + dropObject(idx); + return ret; +} + +const CLOSURE_DTORS = (typeof FinalizationRegistry === 'undefined') + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry(state => { + wasm.__wbindgen_export_1.get(state.dtor)(state.a, state.b) +}); + +function makeMutClosure(arg0, arg1, dtor, f) { + const state = { a: arg0, b: arg1, cnt: 1, dtor }; + const real = (...args) => { + // First up with a closure we increment the internal reference + // count. This ensures that the Rust closure environment won't + // be deallocated while we're invoking it. + state.cnt++; + const a = state.a; + state.a = 0; + try { + return f(a, state.b, ...args); + } finally { + if (--state.cnt === 0) { + wasm.__wbindgen_export_1.get(state.dtor)(a, state.b); + CLOSURE_DTORS.unregister(state); + } else { + state.a = a; + } + } + }; + real.original = state; + CLOSURE_DTORS.register(real, state, state); + return real; +} + +function debugString(val) { + // primitive types + const type = typeof val; + if (type == 'number' || type == 'boolean' || val == null) { + return `${val}`; + } + if (type == 'string') { + return `"${val}"`; + } + if (type == 'symbol') { + const description = val.description; + if (description == null) { + return 'Symbol'; + } else { + return `Symbol(${description})`; + } + } + if (type == 'function') { + const name = val.name; + if (typeof name == 'string' && name.length > 0) { + return `Function(${name})`; + } else { + return 'Function'; + } + } + // objects + if (Array.isArray(val)) { + const length = val.length; + let debug = '['; + if (length > 0) { + debug += debugString(val[0]); + } + for(let i = 1; i < length; i++) { + debug += ', ' + debugString(val[i]); + } + debug += ']'; + return debug; + } + // Test for built-in + const builtInMatches = /\[object ([^\]]+)\]/.exec(toString.call(val)); + let className; + if (builtInMatches && builtInMatches.length > 1) { + className = builtInMatches[1]; + } else { + // Failed to match the standard '[object ClassName]' + return toString.call(val); + } + if (className == 'Object') { + // we're a user defined class or Object + // JSON.stringify avoids problems with cycles, and is generally much + // easier than looping through ownProperties of `val`. + try { + return 'Object(' + JSON.stringify(val) + ')'; + } catch (_) { + return 'Object'; + } + } + // errors + if (val instanceof Error) { + return `${val.name}: ${val.message}\n${val.stack}`; + } + // TODO we could test for more things here, like `Set`s and `Map`s. + return className; +} + +let WASM_VECTOR_LEN = 0; + +const cachedTextEncoder = (typeof TextEncoder !== 'undefined' ? new TextEncoder('utf-8') : { encode: () => { throw Error('TextEncoder not available') } } ); + +const encodeString = (typeof cachedTextEncoder.encodeInto === 'function' + ? function (arg, view) { + return cachedTextEncoder.encodeInto(arg, view); +} + : function (arg, view) { + const buf = cachedTextEncoder.encode(arg); + view.set(buf); + return { + read: arg.length, + written: buf.length + }; +}); + +function passStringToWasm0(arg, malloc, realloc) { + + if (realloc === undefined) { + const buf = cachedTextEncoder.encode(arg); + const ptr = malloc(buf.length, 1) >>> 0; + getUint8ArrayMemory0().subarray(ptr, ptr + buf.length).set(buf); + WASM_VECTOR_LEN = buf.length; + return ptr; + } + + let len = arg.length; + let ptr = malloc(len, 1) >>> 0; + + const mem = getUint8ArrayMemory0(); + + let offset = 0; + + for (; offset < len; offset++) { + const code = arg.charCodeAt(offset); + if (code > 0x7F) break; + mem[ptr + offset] = code; + } + + if (offset !== len) { + if (offset !== 0) { + arg = arg.slice(offset); + } + ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0; + const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len); + const ret = encodeString(arg, view); + + offset += ret.written; + ptr = realloc(ptr, len, offset, 1) >>> 0; + } + + WASM_VECTOR_LEN = offset; + return ptr; +} + +let cachedDataViewMemory0 = null; + +function getDataViewMemory0() { + if (cachedDataViewMemory0 === null || cachedDataViewMemory0.buffer.detached === true || (cachedDataViewMemory0.buffer.detached === undefined && cachedDataViewMemory0.buffer !== wasm.memory.buffer)) { + cachedDataViewMemory0 = new DataView(wasm.memory.buffer); + } + return cachedDataViewMemory0; +} + +function getArrayJsValueFromWasm0(ptr, len) { + ptr = ptr >>> 0; + const mem = getDataViewMemory0(); + const result = []; + for (let i = ptr; i < ptr + 4 * len; i += 4) { + result.push(takeObject(mem.getUint32(i, true))); + } + return result; +} + +export function main_js() { + wasm.main_js(); +} + +function __wbg_adapter_18(arg0, arg1) { + wasm._dyn_core__ops__function__FnMut_____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h03a328ab39659ec3(arg0, arg1); +} + +const CoreInterfaceFinalization = (typeof FinalizationRegistry === 'undefined') + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry(ptr => wasm.__wbg_coreinterface_free(ptr >>> 0, 1)); + +export class CoreInterface { + + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + CoreInterfaceFinalization.unregister(this); + return ptr; + } + + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_coreinterface_free(ptr, 0); + } + constructor() { + const ret = wasm.coreinterface_new(); + this.__wbg_ptr = ret >>> 0; + CoreInterfaceFinalization.register(this, this.__wbg_ptr, this); + return this; + } + init() { + wasm.coreinterface_init(this.__wbg_ptr); + } + /** + * @param {number} timestamp + */ + play(timestamp) { + wasm.coreinterface_play(this.__wbg_ptr, timestamp); + } + stop() { + wasm.coreinterface_stop(this.__wbg_ptr); + } + /** + * @param {number} frequency + */ + add_sine_track(frequency) { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.coreinterface_add_sine_track(retptr, this.__wbg_ptr, frequency); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + if (r1) { + throw takeObject(r0); + } + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } + /** + * @returns {number} + */ + get_timestamp() { + const ret = wasm.coreinterface_get_timestamp(this.__wbg_ptr); + return ret; + } + /** + * @returns {JsTrack[]} + */ + get_tracks() { + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.coreinterface_get_tracks(retptr, this.__wbg_ptr); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + var v1 = getArrayJsValueFromWasm0(r0, r1).slice(); + wasm.__wbindgen_free(r0, r1 * 4, 4); + return v1; + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } + } +} + +const JsTrackFinalization = (typeof FinalizationRegistry === 'undefined') + ? { register: () => {}, unregister: () => {} } + : new FinalizationRegistry(ptr => wasm.__wbg_jstrack_free(ptr >>> 0, 1)); + +export class JsTrack { + + static __wrap(ptr) { + ptr = ptr >>> 0; + const obj = Object.create(JsTrack.prototype); + obj.__wbg_ptr = ptr; + JsTrackFinalization.register(obj, obj.__wbg_ptr, obj); + return obj; + } + + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + JsTrackFinalization.unregister(this); + return ptr; + } + + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_jstrack_free(ptr, 0); + } + /** + * @returns {string} + */ + get name() { + let deferred1_0; + let deferred1_1; + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.jstrack_name(retptr, this.__wbg_ptr); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + deferred1_0 = r0; + deferred1_1 = r1; + return getStringFromWasm0(r0, r1); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + wasm.__wbindgen_free(deferred1_0, deferred1_1, 1); + } + } + /** + * @returns {string} + */ + toString() { + let deferred1_0; + let deferred1_1; + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.jstrack_toString(retptr, this.__wbg_ptr); + var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true); + var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true); + deferred1_0 = r0; + deferred1_1 = r1; + return getStringFromWasm0(r0, r1); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + wasm.__wbindgen_free(deferred1_0, deferred1_1, 1); + } + } +} + +async function __wbg_load(module, imports) { + if (typeof Response === 'function' && module instanceof Response) { + if (typeof WebAssembly.instantiateStreaming === 'function') { + try { + return await WebAssembly.instantiateStreaming(module, imports); + + } catch (e) { + if (module.headers.get('Content-Type') != 'application/wasm') { + console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e); + + } else { + throw e; + } + } + } + + const bytes = await module.arrayBuffer(); + return await WebAssembly.instantiate(bytes, imports); + + } else { + const instance = await WebAssembly.instantiate(module, imports); + + if (instance instanceof WebAssembly.Instance) { + return { instance, module }; + + } else { + return instance; + } + } +} + +function __wbg_get_imports() { + const imports = {}; + imports.wbg = {}; + imports.wbg.__wbg_call_672a4d21634d4a24 = function() { return handleError(function (arg0, arg1) { + const ret = getObject(arg0).call(getObject(arg1)); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_close_5a97ef05b337f8ce = function() { return handleError(function (arg0) { + const ret = getObject(arg0).close(); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_connect_b22945d106632a36 = function() { return handleError(function (arg0, arg1) { + const ret = getObject(arg0).connect(getObject(arg1)); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_copyToChannel_b81ecf19fd54e146 = function() { return handleError(function (arg0, arg1, arg2, arg3) { + getObject(arg0).copyToChannel(getArrayF32FromWasm0(arg1, arg2), arg3); + }, arguments) }; + imports.wbg.__wbg_createBufferSource_f7860a96f709acbd = function() { return handleError(function (arg0) { + const ret = getObject(arg0).createBufferSource(); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_createBuffer_926beeec3ff39b5a = function() { return handleError(function (arg0, arg1, arg2, arg3) { + const ret = getObject(arg0).createBuffer(arg1 >>> 0, arg2 >>> 0, arg3); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_currentTime_adef4d803f58eb66 = function(arg0) { + const ret = getObject(arg0).currentTime; + return ret; + }; + imports.wbg.__wbg_destination_6400091abd6f01b3 = function(arg0) { + const ret = getObject(arg0).destination; + return addHeapObject(ret); + }; + imports.wbg.__wbg_eval_e10dc02e9547f640 = function() { return handleError(function (arg0, arg1) { + const ret = eval(getStringFromWasm0(arg0, arg1)); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_instanceof_Window_def73ea0955fc569 = function(arg0) { + let result; + try { + result = getObject(arg0) instanceof Window; + } catch (_) { + result = false; + } + const ret = result; + return ret; + }; + imports.wbg.__wbg_jstrack_new = function(arg0) { + const ret = JsTrack.__wrap(arg0); + return addHeapObject(ret); + }; + imports.wbg.__wbg_log_c222819a41e063d3 = function(arg0) { + console.log(getObject(arg0)); + }; + imports.wbg.__wbg_maxChannelCount_a06f8ca4190698ed = function(arg0) { + const ret = getObject(arg0).maxChannelCount; + return ret; + }; + imports.wbg.__wbg_new_405e22f390576ce2 = function() { + const ret = new Object(); + return addHeapObject(ret); + }; + imports.wbg.__wbg_newnoargs_105ed471475aaf50 = function(arg0, arg1) { + const ret = new Function(getStringFromWasm0(arg0, arg1)); + return addHeapObject(ret); + }; + imports.wbg.__wbg_newwithcontextoptions_b62c06fed7900366 = function() { return handleError(function (arg0) { + const ret = new lAudioContext(getObject(arg0)); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_resume_35efdc4ffe13bf18 = function() { return handleError(function (arg0) { + const ret = getObject(arg0).resume(); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_setTimeout_f2fe5af8e3debeb3 = function() { return handleError(function (arg0, arg1, arg2) { + const ret = getObject(arg0).setTimeout(getObject(arg1), arg2); + return ret; + }, arguments) }; + imports.wbg.__wbg_setbuffer_10a9ee2a05c73896 = function(arg0, arg1) { + getObject(arg0).buffer = getObject(arg1); + }; + imports.wbg.__wbg_setchannelCount_876fcf5798895180 = function(arg0, arg1) { + getObject(arg0).channelCount = arg1 >>> 0; + }; + imports.wbg.__wbg_setonended_00ff85c70a4f819f = function(arg0, arg1) { + getObject(arg0).onended = getObject(arg1); + }; + imports.wbg.__wbg_setsamplerate_8bc3fd769a6db02b = function(arg0, arg1) { + getObject(arg0).sampleRate = arg1; + }; + imports.wbg.__wbg_start_e81f89e130c3c86e = function() { return handleError(function (arg0, arg1) { + getObject(arg0).start(arg1); + }, arguments) }; + imports.wbg.__wbg_static_accessor_GLOBAL_88a902d13a557d07 = function() { + const ret = typeof global === 'undefined' ? null : global; + return isLikeNone(ret) ? 0 : addHeapObject(ret); + }; + imports.wbg.__wbg_static_accessor_GLOBAL_THIS_56578be7e9f832b0 = function() { + const ret = typeof globalThis === 'undefined' ? null : globalThis; + return isLikeNone(ret) ? 0 : addHeapObject(ret); + }; + imports.wbg.__wbg_static_accessor_SELF_37c5d418e4bf5819 = function() { + const ret = typeof self === 'undefined' ? null : self; + return isLikeNone(ret) ? 0 : addHeapObject(ret); + }; + imports.wbg.__wbg_static_accessor_WINDOW_5de37043a91a9c40 = function() { + const ret = typeof window === 'undefined' ? null : window; + return isLikeNone(ret) ? 0 : addHeapObject(ret); + }; + imports.wbg.__wbindgen_boolean_get = function(arg0) { + const v = getObject(arg0); + const ret = typeof(v) === 'boolean' ? (v ? 1 : 0) : 2; + return ret; + }; + imports.wbg.__wbindgen_cb_drop = function(arg0) { + const obj = takeObject(arg0).original; + if (obj.cnt-- == 1) { + obj.a = 0; + return true; + } + const ret = false; + return ret; + }; + imports.wbg.__wbindgen_closure_wrapper99 = function(arg0, arg1, arg2) { + const ret = makeMutClosure(arg0, arg1, 40, __wbg_adapter_18); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_debug_string = function(arg0, arg1) { + const ret = debugString(getObject(arg1)); + const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); + getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); + }; + imports.wbg.__wbindgen_is_undefined = function(arg0) { + const ret = getObject(arg0) === undefined; + return ret; + }; + imports.wbg.__wbindgen_object_clone_ref = function(arg0) { + const ret = getObject(arg0); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_object_drop_ref = function(arg0) { + takeObject(arg0); + }; + imports.wbg.__wbindgen_string_new = function(arg0, arg1) { + const ret = getStringFromWasm0(arg0, arg1); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_throw = function(arg0, arg1) { + throw new Error(getStringFromWasm0(arg0, arg1)); + }; + + return imports; +} + +function __wbg_init_memory(imports, memory) { + +} + +function __wbg_finalize_init(instance, module) { + wasm = instance.exports; + __wbg_init.__wbindgen_wasm_module = module; + cachedDataViewMemory0 = null; + cachedFloat32ArrayMemory0 = null; + cachedUint8ArrayMemory0 = null; + + + wasm.__wbindgen_start(); + return wasm; +} + +function initSync(module) { + if (wasm !== undefined) return wasm; + + + if (typeof module !== 'undefined') { + if (Object.getPrototypeOf(module) === Object.prototype) { + ({module} = module) + } else { + console.warn('using deprecated parameters for `initSync()`; pass a single object instead') + } + } + + const imports = __wbg_get_imports(); + + __wbg_init_memory(imports); + + if (!(module instanceof WebAssembly.Module)) { + module = new WebAssembly.Module(module); + } + + const instance = new WebAssembly.Instance(module, imports); + + return __wbg_finalize_init(instance, module); +} + +async function __wbg_init(module_or_path) { + if (wasm !== undefined) return wasm; + + + if (typeof module_or_path !== 'undefined') { + if (Object.getPrototypeOf(module_or_path) === Object.prototype) { + ({module_or_path} = module_or_path) + } else { + console.warn('using deprecated parameters for the initialization function; pass a single object instead') + } + } + + if (typeof module_or_path === 'undefined') { + module_or_path = new URL('lightningbeam_core_bg.wasm', import.meta.url); + } + const imports = __wbg_get_imports(); + + if (typeof module_or_path === 'string' || (typeof Request === 'function' && module_or_path instanceof Request) || (typeof URL === 'function' && module_or_path instanceof URL)) { + module_or_path = fetch(module_or_path); + } + + __wbg_init_memory(imports); + + const { instance, module } = await __wbg_load(await module_or_path, imports); + + return __wbg_finalize_init(instance, module); +} + +export { initSync }; +export default __wbg_init; diff --git a/src/pkg/lightningbeam_core_bg.wasm b/src/pkg/lightningbeam_core_bg.wasm new file mode 100644 index 0000000000000000000000000000000000000000..720d4342d669742e7235e3d6708f3ce00d567c41 GIT binary patch literal 135753 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 void; +export const jstrack_name: (a: number, b: number) => void; +export const jstrack_toString: (a: number, b: number) => void; +export const __wbg_coreinterface_free: (a: number, b: number) => void; +export const coreinterface_new: () => number; +export const coreinterface_init: (a: number) => void; +export const coreinterface_play: (a: number, b: number) => void; +export const coreinterface_stop: (a: number) => void; +export const coreinterface_add_sine_track: (a: number, b: number, c: number) => void; +export const coreinterface_get_timestamp: (a: number) => number; +export const coreinterface_get_tracks: (a: number, b: number) => void; +export const main_js: () => void; +export const __wbindgen_exn_store: (a: number) => void; +export const __wbindgen_export_1: WebAssembly.Table; +export const __wbindgen_malloc: (a: number, b: number) => number; +export const __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number; +export const __wbindgen_add_to_stack_pointer: (a: number) => number; +export const __wbindgen_free: (a: number, b: number, c: number) => void; +export const _dyn_core__ops__function__FnMut_____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h03a328ab39659ec3: (a: number, b: number) => void; +export const __wbindgen_start: () => void; diff --git a/src/pkg/package.json b/src/pkg/package.json new file mode 100644 index 0000000..b23063e --- /dev/null +++ b/src/pkg/package.json @@ -0,0 +1,14 @@ +{ + "name": "lightningbeam-core", + "version": "0.1.0", + "files": [ + "lightningbeam_core_bg.wasm", + "lightningbeam_core.js", + "lightningbeam_core.d.ts" + ], + "module": "lightningbeam_core.js", + "types": "lightningbeam_core.d.ts", + "sideEffects": [ + "./snippets/*" + ] +} \ No newline at end of file