OpenAL:混合alSourcei和alSourceQueueBuffers

时间:2017-05-16 17:24:32

标签: audio openal

我们使用的引擎使用节点系统来创建和播放声音。声音从文件加载。然后它设置声音缓冲区使用alSourcei播放声音。 我正在尝试添加Steam聊天代码,以便从填充了通过网络接收的数据的缓冲区播放声音。该代码使用alSourceQueueBuffers对数据进行排队。

alSourceQueueBuffers因“无效操作”而失败。根据OpenAL指南,原因是:

  

没有当前的背景,尝试过   用来添加一个不是的新缓冲区   与已经存在的缓冲区相同的格式   队列,或源已经有一个静态缓冲区   连接。

当然声音格式不同。聊天使用:

alBufferData(nBufferID, AL_FORMAT_MONO16, packet.pData, packet.unSize, VOICE_OUTPUT_SAMPLE_RATE_IDEAL);
alSourceQueueBuffers(pVoiceContext->m_nSource, 1, &nBufferID);

SoundNode类:

result = ParseFileFromBuffer(dataBuffer, bufferSize, &waveInfo);

ALenum format = 0;
result = GetWaveALBufferFormat(waveInfo, &alGetEnumValue, (unsigned long*)&format);
alBufferData(m_alBufferId,format,GetWaveData(waveInfo),GetWaveSize(waveInfo),GetWaveFrequency(waveInfo));


...

// In some other class:
alSourcei(m_alSourceId, AL_BUFFER, m_soundData->alGetBufferId());
if(!m_streaming)
{
    setVolume(volume);

    alSourcei(m_alSourceId, AL_LOOPING, (ALint)repeat);

    setDefaultSurroundProperties();

    // Play Source
    alSourcePlay(m_alSourceId);

...
}

我可以这样做吗?如果没有,你有什么建议吗?

使用XAudio2我可以创建两个引擎,但在Windows上至少OpenAL无法创建第二个上下文。

BTW此代码可能只需要在Linux上使用。

如果我的问题很愚蠢,请耐心等待。我是OpenAL的总菜鸟。

0 个答案:

没有答案