Ogg Vorbisデータをデコードすると言う本編(?)は終わりましたが、これをストリーミング再生するときの注意点なんかを挙げておきます。別にマルチスレッドのプロと言う訳ではないので、参考までに。
- Vorbisfile APIのスレッドセーフティ
-
Vorbisfile APIは、Vorbisfile - Thread Safetyにあるように、一つのOggVorbis_File構造体を同時に使うことのできるスレッドは一つだけです。これを保障するために、マネージドコード側でも複数のスレッドが同時にReadやPositionを使ったりすることが無いようにする必要があります。具体的には、
System.Threading.Mutex
を使うか、lock
文でクリティカルセクションを作って同期しなければなりません。 - Ogg Vorbisの操作は単一スレッドで
-
VS2003でやっていたときはこんなことが起こらなかったと思うのですが、VS2005+MDX 1.1では、スレッドセーフな扱い方をしていても、oggVorbisFile->vd.viがクリアされることがあるようです。この為、AccessViolationExceptionが投げられます。原因を調べようと思いましたが、やってる内にうんざりしたので、OpenCallbacksを呼ぶのもDecodeを呼ぶスレッドでするようにしたら、改善されました。気のせいかもしれませんが。
- 複数スレッドからアクセスされるメンバはvolatile
-
念の為ですが、volatileキーワードを付けておくと、キャッシュが効かなくなるためいつでも正しい値が読み取られます。メインスレッドで位置を取得して、別スレッドでバッファを書き換えるような場合、付けておくと安心です。
コメントする