我試圖播放使用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