继续硬翻——FMOD_NONBLOCKING标签与数据的异步加载

介绍

FMOD_NONBLOCKING使用后,就可以不被应用程序的帧速影响而加载了。

通常情况下的加载都会需要很长的时间,但是如果使用这个标签特性,声音就可以在后台加载了,而不会根据应用程序的节拍。

创建声音

和你平常创建声音的步骤一样,不过这时要加上FMOD_NONBLOCKING标记:

FMOD::Sound *sound;

Result = system->createStream(“…wave.mp3”,FMOD_NONBLOCKING, 0, &sound);

ERRCHECK(result)

现在声音就在后台打开了,并且立即获得了这个声音的句柄。在你调用这个函数之前你不能使用这个句柄做任何事:Sound::getOpenState.任何其他尝试使用这个句柄的操作都将返回FMOD_ERR_NOTREADY.

当声音加载时获得一个回调函数

当声音或流打开,你可以指定一个函数来配置到这个FMOD_CREATESOUNDEXINFO的nonblockcallback成员,在加载结束时会调用。首先,这个函数的定义:

FMOD_RESULT F_CALLBACK nonblockcallback(FMOD_SOUND *sound,FMOD_RESULT result)

{

FMOD::Sound *snd = (FMOD::SOUND*)sound;

Printf(“Sound loaded! (%d) %sn”, result,FMOD_ErrorString(result));

Return FMOD_OK;

}

然后:

FMOD_RESULT result;

FMOD:Sound *sound;

FMOD_CREATESOUNDEXINFO exinfo;

Memset(&exinfo, 0,sizeof(FMOD_CREATESOUNDEXINFO));

Exinfo.cbsize = sizeof(FMOD_CREATESOUNDEXINFO);

Exinfo.nonblockcallback = nonblockcallback;

Result = system->createStream(“..wave.mp3”,FMOD_NONBLOCKING, &exinfo,&sound);

ERRCHECK(result);

等待声音准备好并使用它

提到这个,你需要在音乐后台加载的时候调用这个来判断:Sound::getOpenState.

你可以调用一次,也可以不断的调用这个直到加载成功了。

下面这个离自己来说明直到加载完成,然后播放它:

FMOD_RESULT result;

FMOD::Sound *sound;

Result = system->createStream(“..wave.mp3”,FMOD_NOBLOCKING, 0, &sound);

ERRORCHECK(result);

Do

{

FMOD_OPENSTATE state;

Result =tmpsnd->getOpenState(&state, 0,0);

ERRCHECK(result);

If(state == FMOD_OPENSTATE_READY&& !channel)

{

Result = system->playsound(FMOD_CHANNEL_FREE,sound, false, &channel);

ERRCHECK(result);

}

GameCode();

}while(1)

或者:

Do

{

If(!channel)

{

Result = system->palySound(FMOD_CHANNEL_FREE,sound, false, &channel);

If(result != FMOD_ERR_NOTREADY)

{

ERRHECK(result);

}

}

GameCode();

}while(1)

 

创建一个FSB文件或流

没翻

获得子声音

没翻

发表评论

邮箱地址不会被公开。 必填项已用*标注

* Copy This Password *

* Type Or Paste Password Here *