1

職場では、サウンドを一時停止するために使用することはできません。alSourcePause()いずれの場合も、オフセットを使用してサウンドを開始することをお勧めします。

alSourcei(this->sourceId, AL_SAMPLE_OFFSET, this->sampleOffset);で取得したサンプルオフセットを使用して「再開」を実行していますalGetSourcei()AL_SEC_OFFSET、、AL_BYTE_OFFSETおよびAL_SAMPLE_OFFSET-を使用してみましたが、役に立ちませんでした。音源は「初期」状態である必要があることを読みました。ソースを再作成してバッファをアタッチしてからスキップしようとしても、役に立ちませんでした。

バッファをスキップするように変更すると、AL_BYTE_OFFSETループが複雑になるため、解決策にはなりません。

低速のマシンではストリーミングサウンドがスキップされます。マルチスレッド再生の実装に問題があります。

スケジュールが厳しいので、OS XのOpenALで単純な音源の一部をスキップする最良の方法は何ですか?

ソースコードは、Sourceforgeリポジトリで入手できます。

4

1 に答える 1

4

最近、OS X(10.6.8)のゲームエンジンで同じ問題が発生しました。指定されたサンプルオフセットで静的バッファーの再生を再開するときに、次の手順をこの順序で実行しました。

alSourceQueueBuffers(mSourceId, 1, mBufferId);
alSourcei(mSourceId, AL_SAMPLE_OFFSET, mSampleOffset);
alSourcePlay(mSourceId);

その前にソースが停止され、すべてのバッファーがキューから取り出されました。AL 1.1の仕様によると、次のいずれかが可能であるはずです。

  1. ソースが停止状態のときのバッファオフセットを指定します。ここでは、オフセットは次のalSourcePlay()呼び出しで適用されることになっています。
  2. すでに再生されているソースのオフセットを指定します。これにより、目的の位置にすぐにスキップされます。

( http://connect.creativelabs.com/openal/Documentation/OpenAL%201.1%20Specification.htmの公式仕様のセクション4.3.2を参照してください)

上記のシーケンスの後半の2つの呼び出しを逆にする(つまり、alSourcePlay()呼び出しを発行した後にバッファーオフセットを設定する)ことで、この場合のトリックが実行されました。技術的には、これは完全に有効な方法です。ただし、これら2つの呼び出しの間にオーディオスレッドが長時間中断されると、グリッチが聞こえる可能性があります。

于 2011-07-08T12:20:39.827 に答える