我试过了
alBufferf (myChannelId, AL_MAX_GAIN (and AL_GAIN), volumeValue);
并得到错误 0xA002。
正如 Isaac 所说,您可能希望为您的 a 资源设置增益:
alSourcef (sourceID, AL_GAIN, volume)
为避免将来收到神秘的错误代码,您应该养成在您认为可能失败/尝试调试的呼叫之后轮询错误的习惯。
这样,您会立即知道“0xA002”是“ AL_INVALID_ENUM ”。
要使用 OpenAL 执行此操作,请调用“alGetError()”,它会清除并返回最近的错误;
ALenum ALerror = AL_NO_ERROR;
ALerror = alGetError();
std::cout << getALErrorString(ALerror) << std::endl;
您需要编写类似这样的内容来获取错误代码并返回/打印字符串
std::string getALErrorString(ALenum err) {
switch(err) {
case AL_NO_ERROR: return std::string("AL_NO_ERROR - (No error)."); break;
case AL_INVALID_NAME: return std::string("AL_INVALID_NAME - Invalid Name paramater passed to AL call."); break;
case AL_INVALID_ENUM: return std::string("AL_INVALID_ENUM - Invalid parameter passed to AL call."); break;
case AL_INVALID_VALUE: return std::string("AL_INVALID_VALUE - Invalid enum parameter value."); break;
case AL_INVALID_OPERATION: return std::string("AL_INVALID_OPERATION"); break;
case AL_OUT_OF_MEMORY: return std::string("AL_OUT_OF_MEMORY"); break;
default: return std::string("AL Unknown Error."); break;
};
}
您可以在OpenAL Programmer's Guide中准确查找错误代码对特定函数调用的含义。
例如,在第 39 页上,您可以看到 alSourcef 上的 AL_INVALID_ENUM 表示“指定的参数无效”。
0xA002 是 linux 中的非法枚举错误。
你明白了,因为不可能修改缓冲区的增益。没有这样的事情。
您可以做的是将 AL_GAIN 属性设置为侦听器(将其应用于当前上下文中的所有源)或特定源。