Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qwasmwebaudiosource.cpp File Reference

(3d4fba00ae895807eabe9d8b0f99f4166e4235a6)

#include "qwasmwebaudiosource_p.h"
#include <emscripten.h>
#include <emscripten/val.h>
#include <QDebug>
#include <QtMath>
#include <QIODevice>
Include dependency graph for qwasmwebaudiosource.cpp:

Go to the source code of this file.

Classes

class  QWasmAudioSourceDevice

Functions

EMSCRIPTEN_KEEPALIVE void qt_onWorkletReady (int id)
EMSCRIPTEN_KEEPALIVE void qt_onAudioFrameReady (int id)
 EM_JS (void, qt_st_loadWorkletModule,(EM_VAL ctxHandle, int instanceId), { var ctx=Emval.toValue(ctxHandle);if(!Module._qtAudioData) Module._qtAudioData={};Module._qtAudioData[instanceId]=[];var code=[ 'class QtCapture extends AudioWorkletProcessor {', ' process(inputs) {', ' var input=inputs[0];', ' if(input &&input.length &&input[0] &&input[0].length) {', ' var numChannels=input.length, samplesPerChannel=input[0].length;', ' var buffer=new Float32Array(numChannels *samplesPerChannel);', ' for(var c=0;c< numChannels;c++) buffer.set(input[c], c *samplesPerChannel);', ' this.port.postMessage({ch:numChannels, spch:samplesPerChannel, buf:buffer.buffer},[buffer.buffer]);', ' }', ' return true;', ' }', '}', 'registerProcessor("qt-audio-capture", QtCapture);'].join('\n');var blob=new Blob([code], {type:'application/javascript'});var url=URL.createObjectURL(blob);ctx.audioWorklet.addModule(url).then(function() { URL.revokeObjectURL(url);Module._qt_onWorkletReady(instanceId);});})
 EM_JS (EM_VAL, qt_st_createWorkletNode,(EM_VAL ctxHandle, int instanceId, int channelCount), { var node=new AudioWorkletNode(Emval.toValue(ctxHandle), 'qt-audio-capture', { numberOfInputs:1, numberOfOutputs:0, channelCount:channelCount, channelCountMode:'explicit' });node.port.onmessage=function(e) { Module._qtAudioData[instanceId].push(e.data);Module._qt_onAudioFrameReady(instanceId);};return Emval.toHandle(node);})
 EM_JS (int, qt_st_readFrame,(int instanceId, float *heapPtr, int *outCh, int *outSpch), { var q=Module._qtAudioData &&Module._qtAudioData[instanceId];if(!q||!q.length) return 0;var frame=q.shift();var data=new Float32Array(frame.buf);HEAPF32.set(data, heapPtr > > 2);HEAP32[outCh > > 2]=frame.ch;HEAP32[outSpch > > 2]=frame.spch;return data.length;})
static void convertFloatToPcm (const float *planarData, int numChannels, int samplesPerChannel, float volume, QAudioFormat::SampleFormat fmt, int bytesPerSample, char *out)

Variables

QT_BEGIN_NAMESPACE constexpr unsigned int DEFAULT_BUFFER_DURATION = 250'000
static QHash< int, QWasmAudioSource * > s_registry

Function Documentation

◆ convertFloatToPcm()

void convertFloatToPcm ( const float * planarData,
int numChannels,
int samplesPerChannel,
float volume,
QAudioFormat::SampleFormat fmt,
int bytesPerSample,
char * out )
static

Definition at line 211 of file qwasmwebaudiosource.cpp.

◆ EM_JS() [1/3]

EM_JS ( EM_VAL ,
qt_st_createWorkletNode ,
(EM_VAL ctxHandle, int instanceId, int channelCount) ,
{ var node=new AudioWorkletNode(Emval.toValue(ctxHandle), 'qt-audio-capture', { numberOfInputs:1, numberOfOutputs:0, channelCount:channelCount, channelCountMode:'explicit' });node.port.onmessage=function(e) { Module._qtAudioData[instanceId].push(e.data);Module._qt_onAudioFrameReady(instanceId);};return Emval.toHandle(node);}  )

◆ EM_JS() [2/3]

EM_JS ( int ,
qt_st_readFrame ,
(int instanceId, float *heapPtr, int *outCh, int *outSpch) ,
{ var q=Module._qtAudioData &&Module._qtAudioData[instanceId];if(!q||!q.length) return 0;var frame=q.shift();var data=new Float32Array(frame.buf);HEAPF32.set(data, heapPtr > > 2);HEAP32[outCh > > 2]=frame.ch;HEAP32[outSpch > > 2]=frame.spch;return data.length;}  )

References EM_JS().

Referenced by EM_JS().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ EM_JS() [3/3]

EM_JS ( void ,
qt_st_loadWorkletModule ,
(EM_VAL ctxHandle, int instanceId) ,
{ var ctx=Emval.toValue(ctxHandle);if(!Module._qtAudioData) Module._qtAudioData={};Module._qtAudioData[instanceId]=[];var code=[ 'class QtCapture extends AudioWorkletProcessor {', ' process(inputs) {', ' var input=inputs[0];', ' if(input &&input.length &&input[0] &&input[0].length) {', ' var numChannels=input.length, samplesPerChannel=input[0].length;', ' var buffer=new Float32Array(numChannels *samplesPerChannel);', ' for(var c=0;c< numChannels;c++) buffer.set(input[c], c *samplesPerChannel);', ' this.port.postMessage({ch:numChannels, spch:samplesPerChannel, buf:buffer.buffer},[buffer.buffer]);', ' }', ' return true;', ' }', '}', 'registerProcessor("qt-audio-capture", QtCapture);'].join('\n');var blob=new Blob([code], {type:'application/javascript'});var url=URL.createObjectURL(blob);ctx.audioWorklet.addModule(url).then(function() { URL.revokeObjectURL(url);Module._qt_onWorkletReady(instanceId);});}  )

References EM_JS().

Here is the call graph for this function:

◆ qt_onAudioFrameReady()

EMSCRIPTEN_KEEPALIVE void qt_onAudioFrameReady ( int id)

Definition at line 39 of file qwasmwebaudiosource.cpp.

References QWasmAudioSource::audioDataCallback().

Here is the call graph for this function:

◆ qt_onWorkletReady()

EMSCRIPTEN_KEEPALIVE void qt_onWorkletReady ( int id)

Definition at line 38 of file qwasmwebaudiosource.cpp.

References QWasmAudioSource::workletReadyCallback().

Here is the call graph for this function:

Variable Documentation

◆ DEFAULT_BUFFER_DURATION

QT_BEGIN_NAMESPACE constexpr unsigned int DEFAULT_BUFFER_DURATION = 250'000
constexpr

Definition at line 16 of file qwasmwebaudiosource.cpp.

◆ s_registry

QHash< int, QWasmAudioSource * > s_registry
static

Definition at line 20 of file qwasmwebaudiosource.cpp.