Audio OpenAL:混合使用alSourcei和alSourceQueueBuffers

Audio OpenAL:混合使用alSourcei和alSourceQueueBuffers,audio,openal,Audio,Openal,我们使用的引擎使用一个节点系统来创建和播放声音。声音是从文件中加载的。然后设置声音缓冲区,并使用alSourcei播放声音。 我正在尝试添加Steam聊天代码来播放缓冲区中的声音,缓冲区中充满了通过网络接收的数据。代码使用alSourceQueueBuffers对数据进行排队 alSourceQueueBuffers因“操作无效”而失败。根据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无法创建第二个上下文

顺便说一句,这段代码可能只需要在Linux上使用

如果我的问题很愚蠢,请容忍我。我是OpenAL的不速之客。

“第二个环境”?您可以为不同的缓冲区类型创建第二个源(并行)。这就是你想要的吗?“第二个背景”?您可以为不同的缓冲区类型创建第二个源(并行)。这就是你想要的吗?