2010-02-26 90 views
1

我试图播放使用FMOD的声音的一部分,例如帧20000帧文件的帧50000-100000。 我已经找到了一些方法来寻求前进(即开始播放帧50000),但我还没有找到一种方法来确保声音停止在100000播放。有什么办法FMOD可以本身做到这一点,而无需添加lbsndfile或类似的图片?使用FMOD播放声音的一部分

我还应该提及,我正在使用流选项。我不得不假设这些声音是任意大的,并且不能舒适/快速地加载到内存中。

回答

4

您可以使用Channel :: setDelay来准确开始和停止声音。使用FMOD_DELAYTYPE_DSPCLOCK_START设置声音的开始时间,并使用FMOD_DELAYTYPE_DSPCLOCK_END设置结束时间。

查看Channel :: setDelay,FMOD_DELAYTYPE,System :: getDSPClock的文档。

1

你应该能够使用流回调来停止流,当你到达所需的点。

选项1:创建流时,将lenbytes设置为您希望播放帧数的偶数除数。在你的例子中,将'lenbytes'设置为5000,然后在回调中保留一个计数器。当你达到10时,停止流。

选项2:使用FSOUND_Stream_AddSyncPoint并将pcmoffset设置为您想要的停靠点。用FSOUND_Stream_SetSyncCallback注册回拨。在回调中停止流。

+0

感谢您的支持。为了确认,这两种方法都是不正确的?它们取决于何时到达停止流代码。没有任何方法可以精确地发挥一定的时间间隔? – 2010-02-27 02:00:35

1

要以样本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 ...