C#でOgg Vorbis - 附録

| コメント(0) | トラックバック(0)

概要: Ogg Vorbisデータをデコードすると言う本編(?)は終わりましたが、これをストリーミング再生するときの注意点なんかを挙げておきます。別にマルチスレッドのプロと言う訳ではないので、参考までに。 V...

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キーワードを付けておくと、キャッシュが効かなくなるためいつでも正しい値が読み取られます。メインスレッドで位置を取得して、別スレッドでバッファを書き換えるような場合、付けておくと安心です。

トラックバック(0)

トラックバックURL: http://w4ard.s26.xrea.com/program/mt/mt-tb.cgi/11

コメントする

このブログ記事について

このページは、E+Xが2006年10月12日 16:03に書いたブログ記事です。

ひとつ前のブログ記事は「C#でOgg Vorbis - デコード」です。

次のブログ記事は「Windows Vistaが出たと言うことで」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。