我们使用的引擎使用节点系统来创建和播放声音。声音从文件加载。然后它设置声音缓冲区使用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的总菜鸟。