OpenAL problem - changing gain of source

若如初见. 提交于 2019-12-12 14:45:44

问题


I've recently been working on porting my game to be cross-platform, and decided to go with OpenAL for my cross-platform audio engine.

I have 16 "channels" (OpenAL sources) for playing up to 16 sounds concurrently. To play a sound, I switch which buffer is linked to a given source, and also set the gain, source position, and so on in order to play a sound in a given "channel" (source).

The problem is, I've noticed that my "gain" settings do not seem to have immediate effect. For instance, if a loud "lightning" sound plays in a given source at 0.5 gain, then when I have a button click sound play at 0.15 gain later, this click starts off FAR too loud. Then, each subsequent time it is played, the volume decreases until around the 3rd or 4th click it sounds like it's around the proper 0.15 gain.

The first button click is barely audible, and it seems to ramp up in volume until it reaches the 0.15 gain.

So in short, a "source" seems to be remembering the former gain settings, even though I am resetting those before playing a new sound in the same source! Is this a bug? Or something I don't understand about OpenAL? How can I get it to "instantly" change to the new gain/position settings?

Relevant code to play a sound:

[Channel is a value between 0 and 15, soundID is a valid index into the gBuffer array, stereoPosition is an integer between -255 and 255, and volume is between 0 and 255. This is from a function that's a wrapper for my game that used to use values between 0-255, so it converts the values to proper OpenAL values.]

    // Stop any sound currently playing in this channel ("source")
alSourceStop( gSource[channel] );

    // What sound effect ("buffer") is currently linked with this channel? (Even if not currently playing)
alGetSourcei( gSource[channel], AL_BUFFER, &curBuffer );

    // attach a different buffer (sound effect) to the source (channel) only if it's different than the previously-attached one.
    // (Avoid error code by changing it only if it's different)
if (curBuffer != gBuffer[soundID])  
    alSourcei( gSource[channel], AL_BUFFER, gBuffer[soundID] );

    // Loop the sound?
alSourcei( gSource[channel], AL_LOOPING, (loopType == kLoopForever)  );

    // For OpenAL, we do this BEFORE starting the sound effect, to avoid sudden changes a split second after it starts!
volume = (volume / 2) + 1;  // Convert from 0-255 to 0-128

{
    float sourcePos[3] = {(float)stereoPosition / 50, 0.0, 2.0};

        // Set Source Position
    alSourcefv( gSource[channelNum], AL_POSITION, sourcePos );  // fv = float vector

        // Set source volume
    alSourcef( gSource[channelNum], AL_GAIN, (float)newVolume / 255 );
}

    // Start playing the sound!
alSourcePlay( gSource[channel] );

I can post setup code too if desired, but nothing fancy there. Just calling

alSourcef( gSource[n], AL_REFERENCE_DISTANCE, 5.0f );

for each source.

来源:https://stackoverflow.com/questions/6960731/openal-problem-changing-gain-of-source

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!