代码之家  ›  专栏  ›  技术社区  ›  brigadir

如何在Openal中设置通道增益?

  •  0
  • brigadir  · 技术社区  · 15 年前

    我试过

    alBufferf (myChannelId, AL_MAX_GAIN (and AL_GAIN), volumeValue);
    

    并得到错误0xA002。

    2 回复  |  直到 15 年前
        1
  •  0
  •   Isaac Nequittepas    15 年前

    0xA002是Linux中的非法枚举错误。

    你得到它是因为它不可能修改缓冲器的增益。没有这样的事。

    您可以将al-gain属性设置为侦听器(将其应用于当前上下文中的所有源)或特定源。

        2
  •  1
  •   RJFalconer    15 年前

    正如艾萨克所说,你可能想从你的A资源中获得收益:

    alSourcef (sourceID, AL_GAIN, volume)
    

    为了避免在将来收到神秘的错误代码,您应该养成在您认为可能失败的调用/尝试调试的调用之后对错误进行轮询的习惯。

    这样,你马上就会知道 “0xa0.2” 阿尔卑斯 “。

    要使用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 means“ 指定的参数无效 “。

    推荐文章