2010-02-26 91 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 ...