AL 音效的一个问题

今天踩了个小坑,项目中的音效播放出了问题。

项目用的是 cocos2dx 的那套 sound 代码。

某个音效由于不存在,所以创建失败了。这不奇怪。但是之后复用这个 bufferid 的时候就很诡异了。无论是:

1
alDeleteBuffers(1, &_buffers[soundId].bufferId);

还是

1
alGenBuffers(1, &_buffers[soundId].bufferId);

返回的都是 a001 或者 a003。

最后才找到原因。自己曾经加了一个获取音效长度的接口:

1
2
3
4
5
6
7
8
9
10
11
12
static int lua_get_sound_length(lua_State* L){
unsigned int s_id = (unsigned int)lua_tointeger(L,1);
ALint bufferID, bufferSize, frequency, bitsPerSample, channels;
alGetSourcei(s_id, AL_BUFFER, &bufferID);
alGetBufferi(bufferID, AL_SIZE, &bufferSize);
alGetBufferi(bufferID, AL_FREQUENCY, &frequency);
alGetBufferi(bufferID, AL_CHANNELS, &channels);
alGetBufferi(bufferID, AL_BITS, &bitsPerSample);

double result = ((double)bufferSize)/(frequency*channels*(bitsPerSample/8));
lua_pushnumber(L, (double)result);
return 1;

但当传入的 s_id 是一个无效的 source_id 时,貌似就会破坏 AL 对这个 s_id 维护的状态了。于是不能销毁也不能复用了。

具体原因一时半会也找不到,没空看 AL 的代码。 暂时先不用这个 lua_get_sound_length 好了。

作者

薯条

发布于

2014-08-12

更新于

2024-01-15

许可协议

评论