1

FMOD を使用してサウンドの一部のみを再生しようとしています。たとえば、200000 フレーム ファイルのフレーム 50000 ~ 100000 です。順方向にシークする方法をいくつか見つけました (つまり、フレーム 50000 で再生を開始する) が、サウンドが 100000 で再生を停止することを確認する方法は見つかりませんでした。などを写真に入れますか?

また、ストリーミング オプションを使用していることにも言及する必要があります。これらのサウンドは任意に大きく、快適に/すばやくメモリにロードできないと想定する必要があります。

4

3 に答える 3

4

Channel::setDelay を使用して、サンプルの正確なサウンドの開始と停止を行うことができます。FMOD_DELAYTYPE_DSPCLOCK_START を使用してサウンドの開始時間を設定し、FMOD_DELAYTYPE_DSPCLOCK_END を使用して終了時間を設定します。

Channel::setDelay、FMOD_DELAYTYPE、System::getDSPClock のドキュメントを確認してください。

于 2010-03-25T21:32:29.970 に答える
1

目的のポイントに到達したら、ストリーミング コールバックを使用してストリームを停止できるはずです。

オプション 1: ストリームを作成するときに、lenbytes再生するフレーム数の偶数の除数に設定します。あなたの例では、「lenbytes」を 5000 に設定してから、コールバックにカウンターを保持します。10 になったら、ストリームを停止します。

オプション 2:目的の停止ポイントに設定して使用FSOUND_Stream_AddSyncPointします。pcmoffsetでコールバックを登録しますFSOUND_Stream_SetSyncCallback。コールバックでストリームを停止します。

于 2010-02-26T22:14:49.283 に答える
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 ...
于 2010-07-26T13:30:14.427 に答える