Audio OpenAL:混合使用alSourcei和alSourceQueueBuffers
我们使用的引擎使用一个节点系统来创建和播放声音。声音是从文件中加载的。然后设置声音缓冲区,并使用alSourcei播放声音。 我正在尝试添加Steam聊天代码来播放缓冲区中的声音,缓冲区中充满了通过网络接收的数据。代码使用alSourceQueueBuffers对数据进行排队 alSourceQueueBuffers因“操作无效”而失败。根据OpenAL指南,原因是: 没有当前上下文,尝试失败 用于添加一个新的缓冲区,该缓冲区不是 与中已存在的缓冲区格式相同 队列,或源已具有静态缓冲区 附件 当然,声音格式是不同的。正如聊天室使用的:Audio OpenAL:混合使用alSourcei和alSourceQueueBuffers,audio,openal,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无法创建第二个上下文
顺便说一句,这段代码可能只需要在Linux上使用
如果我的问题很愚蠢,请容忍我。我是OpenAL的不速之客。“第二个环境”?您可以为不同的缓冲区类型创建第二个源(并行)。这就是你想要的吗?“第二个背景”?您可以为不同的缓冲区类型创建第二个源(并行)。这就是你想要的吗?