Adicionando o ggwave.js
This commit is contained in:
1 parent
eee054259f
commit
d8efdf827a
2 files changed
+210
No files matched your search
@@ -0,0 +1,20 @@
|
|||||||
|
|
||||||
|
var ggwave_factory = (() => {
|
||||||
|
var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined;
|
||||||
|
if (typeof __filename !== 'undefined') _scriptDir = _scriptDir || __filename;
|
||||||
|
return (
|
||||||
|
function(moduleArg = {}) {
|
||||||
|
|
||||||
|
var Module=moduleArg;var readyPromiseResolve,readyPromiseReject;Module["ready"]=new Promise((resolve,reject)=>{readyPromiseResolve=resolve;readyPromiseReject=reject});var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var ENVIRONMENT_IS_WEB=typeof window=="object";var ENVIRONMENT_IS_WORKER=typeof importScripts=="function";var ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string";var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle;if(ENVIRONMENT_IS_NODE){var fs=require("fs");var nodePath=require("path");if(ENVIRONMENT_IS_WORKER){scriptDirectory=nodePath.dirname(scriptDirectory)+"/"}else{scriptDirectory=__dirname+"/"}read_=(filename,binary)=>{filename=isFileURI(filename)?new URL(filename):nodePath.normalize(filename);return fs.readFileSync(filename,binary?undefined:"utf8")};readBinary=filename=>{var ret=read_(filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}return ret};readAsync=(filename,onload,onerror,binary=true)=>{filename=isFileURI(filename)?new URL(filename):nodePath.normalize(filename);fs.readFile(filename,binary?undefined:"utf8",(err,data)=>{if(err)onerror(err);else onload(binary?data.buffer:data)})};if(!Module["thisProgram"]&&process.argv.length>1){thisProgram=process.argv[1].replace(/\\/g,"/")}arguments_=process.argv.slice(2);quit_=(status,toThrow)=>{process.exitCode=status;throw toThrow};Module["inspect"]=()=>"[Emscripten Module object]"}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}else{scriptDirectory=""}{read_=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=(url,onload,onerror)=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=title=>document.title=title}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.error.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime=Module["noExitRuntime"]||true;if(typeof WebAssembly!="object"){abort("no native wasm support detected")}var wasmMemory;var ABORT=false;var EXITSTATUS;var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateMemoryViews(){var b=wasmMemory.buffer;Module["HEAP8"]=HEAP8=new Int8Array(b);Module["HEAP16"]=HEAP16=new Int16Array(b);Module["HEAPU8"]=HEAPU8=new Uint8Array(b);Module["HEAPU16"]=HEAPU16=new Uint16Array(b);Module["HEAP32"]=HEAP32=new Int32Array(b);Module["HEAPU32"]=HEAPU32=new Uint32Array(b);Module["HEAPF32"]=HEAPF32=new Float32Array(b);Module["HEAPF64"]=HEAPF64=new Float64Array(b)}var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dLine truncated
|
||||||
|
|
||||||
|
|
||||||
|
return moduleArg.ready
|
||||||
|
}
|
||||||
|
|
||||||
|
);
|
||||||
|
})();
|
||||||
|
if (typeof exports === 'object' && typeof module === 'object')
|
||||||
|
module.exports = ggwave_factory;
|
||||||
|
else if (typeof define === 'function' && define['amd'])
|
||||||
|
define([], () => ggwave_factory);
|
||||||
|
|
||||||
+190
@@ -0,0 +1,190 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="en-us">
|
||||||
|
<head>
|
||||||
|
<title>ggwave : javascript example</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="main-container">
|
||||||
|
Minimal <b>ggwave</b> example using Javascript bindings
|
||||||
|
|
||||||
|
<br><br>
|
||||||
|
|
||||||
|
<div>Tx Data:</div> <textarea name="textarea" id="txData" style="width:300px;height:100px;">Hello javascript</textarea><br>
|
||||||
|
|
||||||
|
<button onclick="onSend();">Send</button>
|
||||||
|
|
||||||
|
<br><br>
|
||||||
|
|
||||||
|
<div>Rx data:</div> <textarea name="textarea" id="rxData" style="width:300px;height:100px;" disabled></textarea><br>
|
||||||
|
|
||||||
|
<button id="captureStart">Start capturing</button>
|
||||||
|
<button id="captureStop" hidden>Stop capturing</button>
|
||||||
|
|
||||||
|
<br><br>
|
||||||
|
|
||||||
|
<div class="cell-version">
|
||||||
|
<span>
|
||||||
|
|
|
||||||
|
Build time: <span class="nav-link">@GIT_DATE@</span> |
|
||||||
|
Commit hash: <a class="nav-link" href="https://github.com/ggerganov/ggwave/commit/@GIT_SHA1@">@GIT_SHA1@</a> |
|
||||||
|
Commit subject: <span class="nav-link">@GIT_COMMIT_SUBJECT@</span> |
|
||||||
|
<a class="nav-link" href="https://github.com/ggerganov/ggwave/tree/master/examples/ggwave-js">Source Code</a> |
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script type="text/javascript" src="ggwave.js"></script>
|
||||||
|
<script type='text/javascript'>
|
||||||
|
window.AudioContext = window.AudioContext || window.webkitAudioContext;
|
||||||
|
window.OfflineAudioContext = window.OfflineAudioContext || window.webkitOfflineAudioContext;
|
||||||
|
|
||||||
|
var context = null;
|
||||||
|
var recorder = null;
|
||||||
|
|
||||||
|
// the ggwave module instance
|
||||||
|
var ggwave = null;
|
||||||
|
var parameters = null;
|
||||||
|
var instance = null;
|
||||||
|
|
||||||
|
// instantiate the ggwave instance
|
||||||
|
// ggwave_factory comes from the ggwave.js module
|
||||||
|
ggwave_factory().then(function(obj) {
|
||||||
|
ggwave = obj;
|
||||||
|
});
|
||||||
|
|
||||||
|
var txData = document.getElementById("txData");
|
||||||
|
var rxData = document.getElementById("rxData");
|
||||||
|
var captureStart = document.getElementById("captureStart");
|
||||||
|
var captureStop = document.getElementById("captureStop");
|
||||||
|
|
||||||
|
// helper function
|
||||||
|
function convertTypedArray(src, type) {
|
||||||
|
var buffer = new ArrayBuffer(src.byteLength);
|
||||||
|
var baseView = new src.constructor(buffer).set(src);
|
||||||
|
return new type(buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
// initialize audio context and ggwave
|
||||||
|
function init() {
|
||||||
|
if (!context) {
|
||||||
|
context = new AudioContext({sampleRate: 48000});
|
||||||
|
|
||||||
|
parameters = ggwave.getDefaultParameters();
|
||||||
|
parameters.sampleRateInp = context.sampleRate;
|
||||||
|
parameters.sampleRateOut = context.sampleRate;
|
||||||
|
instance = ggwave.init(parameters);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Tx
|
||||||
|
//
|
||||||
|
|
||||||
|
function onSend() {
|
||||||
|
init();
|
||||||
|
|
||||||
|
// pause audio capture during transmission
|
||||||
|
captureStop.click();
|
||||||
|
|
||||||
|
// generate audio waveform
|
||||||
|
var waveform = ggwave.encode(instance, txData.value, ggwave.ProtocolId.GGWAVE_PROTOCOL_AUDIBLE_FAST, 10)
|
||||||
|
|
||||||
|
// play audio
|
||||||
|
var buf = convertTypedArray(waveform, Float32Array);
|
||||||
|
var buffer = context.createBuffer(1, buf.length, context.sampleRate);
|
||||||
|
buffer.getChannelData(0).set(buf);
|
||||||
|
var source = context.createBufferSource();
|
||||||
|
source.buffer = buffer;
|
||||||
|
source.connect(context.destination);
|
||||||
|
source.start(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Rx
|
||||||
|
//
|
||||||
|
|
||||||
|
captureStart.addEventListener("click", function () {
|
||||||
|
init();
|
||||||
|
|
||||||
|
let constraints = {
|
||||||
|
audio: {
|
||||||
|
// not sure if these are necessary to have
|
||||||
|
echoCancellation: false,
|
||||||
|
autoGainControl: false,
|
||||||
|
noiseSuppression: false
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
navigator.mediaDevices.getUserMedia(constraints).then(function (e) {
|
||||||
|
mediaStream = context.createMediaStreamSource(e);
|
||||||
|
|
||||||
|
var bufferSize = 1024;
|
||||||
|
var numberOfInputChannels = 1;
|
||||||
|
var numberOfOutputChannels = 1;
|
||||||
|
|
||||||
|
if (context.createScriptProcessor) {
|
||||||
|
recorder = context.createScriptProcessor(
|
||||||
|
bufferSize,
|
||||||
|
numberOfInputChannels,
|
||||||
|
numberOfOutputChannels);
|
||||||
|
} else {
|
||||||
|
recorder = context.createJavaScriptNode(
|
||||||
|
bufferSize,
|
||||||
|
numberOfInputChannels,
|
||||||
|
numberOfOutputChannels);
|
||||||
|
}
|
||||||
|
|
||||||
|
recorder.onaudioprocess = function (e) {
|
||||||
|
var source = e.inputBuffer;
|
||||||
|
var res = ggwave.decode(instance, convertTypedArray(new Float32Array(source.getChannelData(0)), Int8Array));
|
||||||
|
|
||||||
|
if (res && res.length > 0) {
|
||||||
|
res = new TextDecoder("utf-8").decode(res);
|
||||||
|
rxData.value = res;
|
||||||
|
}
|
||||||
|
|
||||||
|
// obsolete javascript resampling
|
||||||
|
// since ggwave v0.2.0 the resampling is built-in ggwave
|
||||||
|
//var offlineCtx = new OfflineAudioContext(source.numberOfChannels, 48000*source.duration, 48000);
|
||||||
|
//var offlineSource = offlineCtx.createBufferSource();
|
||||||
|
|
||||||
|
//offlineSource.buffer = source;
|
||||||
|
//offlineSource.connect(offlineCtx.destination);
|
||||||
|
//offlineSource.start();
|
||||||
|
//offlineCtx.startRendering();
|
||||||
|
//offlineCtx.oncomplete = function(e) {
|
||||||
|
// var resampled = e.renderedBuffer.getChannelData(0);
|
||||||
|
// var res = ggwave.decode(instance, convertTypedArray(new Float32Array(resampled), Int8Array));
|
||||||
|
// if (res) {
|
||||||
|
// rxData.value = res;
|
||||||
|
// }
|
||||||
|
//};
|
||||||
|
}
|
||||||
|
|
||||||
|
mediaStream.connect(recorder);
|
||||||
|
recorder.connect(context.destination);
|
||||||
|
}).catch(function (e) {
|
||||||
|
console.error(e);
|
||||||
|
});
|
||||||
|
|
||||||
|
rxData.value = 'Listening ...';
|
||||||
|
captureStart.hidden = true;
|
||||||
|
captureStop.hidden = false;
|
||||||
|
});
|
||||||
|
|
||||||
|
captureStop.addEventListener("click", function () {
|
||||||
|
if (recorder) {
|
||||||
|
recorder.disconnect(context.destination);
|
||||||
|
mediaStream.disconnect(recorder);
|
||||||
|
recorder = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
rxData.value = 'Audio capture is paused! Press the "Start capturing" button to analyze audio from the microphone';
|
||||||
|
captureStart.hidden = false;
|
||||||
|
captureStop.hidden = true;
|
||||||
|
});
|
||||||
|
|
||||||
|
captureStop.click();
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
Reference in new issue
Block a user