无法在Emscripten上使用ofSoundStream听到声音

时间:2019-07-26 13:35:04

标签: emscripten openframeworks

我发现基于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 consoleenter image description here

在Javascript控制台中,我收到以下错误消息:

  

未捕获的TypeError:Runtime.dynCall不是位于的函数   ScriptProcessorNode.stream.onaudioprocess

enter image description here

在终端控制台中,我没有收到任何具体消息。 当然,我完全听不到声音。

我发现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上正常工作?

1 个答案:

答案 0 :(得分:0)

我可以通过将Runtime.dynCall文件中的dynCall更改为library_html5audio.js来解决此问题。

我遵循了this post的建议:

  

此时,Runtime对象已删除了很长时间(要解决该问题,您应该从代码中删除Runtime。,然后调用dynCall)。

修复并重建项目后,我可以在Chrome浏览器中成功听到声音。