今天踩了个小坑,项目中的音效播放出了问题。
项目用的是 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 好了。