qtwebassemblyopenal

How to capture voice with OPENAL in qt webassembly


I want to record sound in qt webassembly. I use openal to capture sound. I use this code successfully in desktop version but in webassembly version it dose not work correctly.

ALenum errorCode=0;
ALuint helloBuffer[16], helloSource[1];
ALCdevice* audioDevice = alcOpenDevice(NULL); // Request default audio device
errorCode = alcGetError(audioDevice);
ALCcontext* audioContext = alcCreateContext(audioDevice,NULL); // Create the audio context
alcMakeContextCurrent(audioContext);
errorCode = alcGetError(audioDevice);

alGetError();
ALCdevice *device = alcCaptureOpenDevice(NULL, SRATE, AL_FORMAT_MONO16, SSIZE);
if (alGetError() != AL_NO_ERROR) {
    return 0;
}
alcCaptureStart(device);
int i=0;
while (i<100) {
    i++;
    alcGetIntegerv(device, ALC_CAPTURE_SAMPLES, (ALCsizei)sizeof(ALint), &sample);
               alcCaptureSamples(device, (ALCvoid *)buffer, sample);
    if(sample >0)
    {
        datarecord.push_back(buffer);
    }
}

Solution

  • #include <QCoreApplication>
    
    #include <stdio.h>
    #include <emscripten.h>
    #include <AL/al.h>
    #include <AL/alc.h>
    #include <QFileDialog>
    
    char  buffer[48000*2];
    QByteArray datarecord;
    int cnt=0;
    
    void mycallback(void *arg)
    {
        ALCint nframes;
        ALCdevice *dev = (ALCdevice*)arg;
    
        alcGetIntegerv(dev, ALC_CAPTURE_SAMPLES, 1, &nframes);
    
        if(nframes>0)
        {
            alcCaptureSamples(dev,buffer, nframes);
            datarecord.append(QByteArray(buffer, nframes*2));
            cnt++;
            if(cnt>1000)
            {
                QString fileName="save";
                QFileDialog::saveFileContent(datarecord, fileName);
    
                emscripten_cancel_main_loop();
            }
    
        }
    }
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
    
        ALCdevice *dev = NULL;
    
        dev = alcCaptureOpenDevice(NULL, 48000, AL_FORMAT_MONO16, 1024);
        alcCaptureStart(dev);
        emscripten_set_main_loop_arg(mycallback, dev, -1, 1);
    
        return a.exec();
    }