9-Laboratory

090625小言。

25.06.2009 (1:04 pm) – Filed under: temp ::

mmioとか滅多につかわないのだけれど。
PlaySound(xxx, SND_MEMORY | SND_ASYNC) is almost always a bad idea.
Windows 7 fixes the PlaySound(XXX, SND_MEMORY|SND_ASYNC) anti-pattern

PlaySound(,SND_MEMORY | SND_ASYNC );はよろしくないらしい。

SND_MEMORYは、メモリから再生するのだけれど、WaveのAPIから読んだものでなくても、
良くてAPIユーザのメモリのポインタを渡すこともできる。
SND_ASYNCは、非同期で再生を行う。例え前の音声を再生中でも呼び出しを即座に帰す。
つまり実際の終了タイミングを知る方法もない。

で、この二つを同時に使ってしまうと、実際に再生が終了するタイミングがわからないものに
メモリを渡しているので、運が悪いと再生中の音源のメモリを解放してしまいクラッシュしてしまう。
解決策としては、PlaySound(NULL,0,0)をそのメモリの解放前に呼べば
本当に再生が終わるまでブロックしてくれるので、これから戻ってきたときに解放すればいいらしい。

この手の「APIの実装に依存するコード」はかっこよくないと考えたのかは知りませんが、
Windows7の実装からは、バッファのコピーをAPI内部で持つようにしたので安心安心。

というWindows7の宣伝。