在 Emscripten 上使用 ofSoundStream 听不到声音
Can't hear sound using ofSoundStream on Emscripten
我发现基于 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 控制台中,我收到以下错误消息:
Uncaught TypeError: Runtime.dynCall is not a function at
ScriptProcessorNode.stream.onaudioprocess
在终端控制台中,我没有收到任何具体消息。
当然,我根本听不到任何声音。
我发现 ofxEmscriptenSoundStream::audio_cb()
函数根本没有被调用,尽管它的函数指针在调用 ofxEmscriptenSoundStream::setup()
时被传递给了 html5audio_stream_create()
函数。
html5audio_stream_create
函数在 library_html5audio.js
文件中实现,我认为以下部分是它调用 ofxEmscriptenSoundStream::audio_cb()
函数的地方:
Runtime.dynCall('viiii',callback,[bufferSize,inputChannels,outputChannels,userData]);
但是我不知道为什么调用回调函数失败。 (我不会写 JS)
如何使 ofSoundStream
在 Emscripten 上正常工作?
我可以通过在 library_html5audio.js
文件中将 Runtime.dynCall
更改为 dynCall
来解决这个问题。
我遵循了 this post 的建议:
The Runtime object has been removed for quite some time at this point (to fix that issue, you should remove Runtime. from your code, and just call dynCall).
修复并重建项目后,我可以在 Chrome 浏览器上成功听到声音。
我发现基于 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 控制台中,我收到以下错误消息:
Uncaught TypeError: Runtime.dynCall is not a function at ScriptProcessorNode.stream.onaudioprocess
在终端控制台中,我没有收到任何具体消息。 当然,我根本听不到任何声音。
我发现 ofxEmscriptenSoundStream::audio_cb()
函数根本没有被调用,尽管它的函数指针在调用 ofxEmscriptenSoundStream::setup()
时被传递给了 html5audio_stream_create()
函数。
html5audio_stream_create
函数在 library_html5audio.js
文件中实现,我认为以下部分是它调用 ofxEmscriptenSoundStream::audio_cb()
函数的地方:
Runtime.dynCall('viiii',callback,[bufferSize,inputChannels,outputChannels,userData]);
但是我不知道为什么调用回调函数失败。 (我不会写 JS)
如何使 ofSoundStream
在 Emscripten 上正常工作?
我可以通过在 library_html5audio.js
文件中将 Runtime.dynCall
更改为 dynCall
来解决这个问题。
我遵循了 this post 的建议:
The Runtime object has been removed for quite some time at this point (to fix that issue, you should remove Runtime. from your code, and just call dynCall).
修复并重建项目后,我可以在 Chrome 浏览器上成功听到声音。