我试图播放使用FMOD的声音的一部分,例如帧20000帧文件的帧50000-100000。 我已经找到了一些方法来寻求前进(即开始播放帧50000),但我还没有找到一种方法来确保声音停止在100000播放。有什么办法FMOD可以本身做到这一点,而无需添加lbsndfile或类似的图片?使用FMOD播放声音的一部分
我还应该提及,我正在使用流选项。我不得不假设这些声音是任意大的,并且不能舒适/快速地加载到内存中。
我试图播放使用FMOD的声音的一部分,例如帧20000帧文件的帧50000-100000。 我已经找到了一些方法来寻求前进(即开始播放帧50000),但我还没有找到一种方法来确保声音停止在100000播放。有什么办法FMOD可以本身做到这一点,而无需添加lbsndfile或类似的图片?使用FMOD播放声音的一部分
我还应该提及,我正在使用流选项。我不得不假设这些声音是任意大的,并且不能舒适/快速地加载到内存中。
您可以使用Channel :: setDelay来准确开始和停止声音。使用FMOD_DELAYTYPE_DSPCLOCK_START设置声音的开始时间,并使用FMOD_DELAYTYPE_DSPCLOCK_END设置结束时间。
查看Channel :: setDelay,FMOD_DELAYTYPE,System :: getDSPClock的文档。
你应该能够使用流回调来停止流,当你到达所需的点。
选项1:创建流时,将lenbytes
设置为您希望播放帧数的偶数除数。在你的例子中,将'lenbytes'设置为5000,然后在回调中保留一个计数器。当你达到10时,停止流。
选项2:使用FSOUND_Stream_AddSyncPoint
并将pcmoffset
设置为您想要的停靠点。用FSOUND_Stream_SetSyncCallback
注册回拨。在回调中停止流。
要以样本50,000开始播放并以100,000结尾,您可以执行以下操作,假定声音文件采样率和系统采样率相同。由于DSP时钟在系统输出样本中工作,您可能需要根据输出速率进行一些数学运算来调整您的最终采样。有关声音采样率的信息,请参阅Sound :: getDefaults,有关系统频率的信息,请参阅System :: getSoftwareFormat。
unsigned int sysHi, sysLo;
// ... create sound, play sound paused ...
// Seek the data to the desired start offset
channel->setPosition(50000, FMOD_TIMEUNIT_PCM);
// For accurate sample playback get the current system "tick"
system->getDSPClock(&sysHi, &sysLo);
// Set start offset to a couple of "mixes" in the future, 2048 samples is far enough in the future to avoid issues with mixer timings
FMOD_64BIT_ADD(sysHi, sysLo, 0, 2048);
channel->setDelay(FMOD_DELAYTYPE_DSPCLOCK_START, sysHi, sysLo);
// Set end offset for 50,000 samples from our start time, which means the end sample will be 100,000
FMOD_64BIT_ADD(sysHi, sysLo, 0, 50000);
channel->setDelay(FMOD_DELAYTYPE_DSPCLOCK_END, sysHi, sysLo);
// ... unpause sound ...
感谢您的支持。为了确认,这两种方法都是不正确的?它们取决于何时到达停止流代码。没有任何方法可以精确地发挥一定的时间间隔? – 2010-02-27 02:00:35