我发现基于ofSoundStream
的示例在Emscripten上无法正常工作。
这是我的最小示例代码,可在macOS上使用,但不适用于Emscripten。
ofApp.h
:
#pragma once
#include "ofMain.h"
class ofApp : public ofBaseApp{
public:
void setup();
void update();
void draw();
void keyPressed(int key);
void keyReleased(int key);
void mouseMoved(int x, int y);
void mouseDragged(int x, int y, int button);
void mousePressed(int x, int y, int button);
void mouseReleased(int x, int y, int button);
void mouseEntered(int x, int y);
void mouseExited(int x, int y);
void windowResized(int w, int h);
void dragEvent(ofDragInfo dragInfo);
void gotMessage(ofMessage msg);
void audioOut(ofSoundBuffer & buffer); //only this is added
};
ofApp.cpp
:(仅相关方法)
#include "ofApp.h"
//--------------------------------------------------------------
void ofApp::setup(){
ofSoundStreamSettings settings;
settings.numInputChannels = 0;
settings.numOutputChannels = 2;
settings.sampleRate = 44100;
settings.bufferSize = 512;
settings.setOutListener(this);
ofSoundStreamSetup(settings);
}
//--------------------------------------------------------------
void ofApp::audioOut(ofSoundBuffer & buffer)
{
for (size_t i = 0; i < buffer.getNumFrames(); ++i)
{
buffer[i*buffer.getNumChannels() ] = ofRandom(0, 1) * 0.1;
buffer[i*buffer.getNumChannels() + 1] = ofRandom(0, 1) * 0.1;
}
}
结果:当我运行它时,它显示为Exception thrown, see JavaScript console
。
在Javascript控制台中,我收到以下错误消息:
未捕获的TypeError:Runtime.dynCall不是位于的函数 ScriptProcessorNode.stream.onaudioprocess
在终端控制台中,我没有收到任何具体消息。 当然,我完全听不到声音。
我发现ofxEmscriptenSoundStream::audio_cb()
函数根本没有被调用,尽管在调用html5audio_stream_create()
时将其函数指针传递给了ofxEmscriptenSoundStream::setup()
函数。
html5audio_stream_create
函数是在library_html5audio.js
文件中实现的,我认为以下是调用ofxEmscriptenSoundStream::audio_cb()
函数的位置:
Runtime.dynCall('viiii',callback,[bufferSize,inputChannels,outputChannels,userData]);
但是我不知道为什么它无法调用回调函数。 (我无法编写JS代码)
如何使ofSoundStream
在Emscripten上正常工作?
答案 0 :(得分:0)
我可以通过将Runtime.dynCall
文件中的dynCall
更改为library_html5audio.js
来解决此问题。
我遵循了this post的建议:
此时,Runtime对象已删除了很长时间(要解决该问题,您应该从代码中删除Runtime。,然后调用dynCall)。
修复并重建项目后,我可以在Chrome浏览器中成功听到声音。