« 武者カーネル現る! | トップページ | 無限プチプチ ぷち萌え(ツンデレ編)釣った♪ »

2008年5月 9日 (金)

『DirectX Graphic』と『DirectShow』の狭間で…

『Direct3D』上で『DirectShow』を使用すると上手く行かない…。

ウインドウモードならOKなのだが
フルスクリーンモードでは、不具合が『たまに』発生する。

ああ、『たまに』と言うのは勘弁して欲しい…。
特に『put_Owner(NULL)』を実行するとフルスクリーンなのに
内部的に何かが無効なってしまう不具合が発生する。

何が悪いの!?
マジで泣きが入ります…。

ああでも無い、こーでも無い…
などと調べて行くと『DirectShow』がメインプロシージャに
メッセージを送っている事を発見。

ヘルプでは、
>アプリケーションが終了する前に、ビデオ ウィンドウの表示を
>False に設定することが重要である。そうしないと、ビデオ
>イメージが画面に残り、ユーザーはそれを除去することができない。
>次に、所有者を NULL にリセットする。そうしないと、間違った
>ウィンドウにメッセージが送信され、エラーが発生する可能性がある。
>pVidWin->put_Visible(OAFALSE);
>pVidWin->put_Owner(NULL);
とある。

で、実際何をしているかと言うと…

『put_Visible(OAFALSE)』で『WM_ERASEBKGND』を発行し
ウインドウのクライアント領域をクリア。

『put_Owner(NULL)』で『WM_NCACTIVATE』を発行し
親ウインドウを非アクティブに切り替え。

『IGraphBuilder』の開放処理中で親ウインドウに色々発行し
最終的にはアクティブに。

もし、『WM_ACTIVATE』内で自前処理を色々していると…
特に画面モードの変更などをしていると何かが壊れるみたい。

多分『put_Owner(NULL)』を呼ばなくてもOKだと思う…。
『put_Owner(NULL)』内で非アクティブにしているのは
アプリケーションとしてダイアログなど複数のウインドウを
活用している時の話なのでは?などと思う。

開放処理中メインのプロシージャは、排他フラグでメッセージを
処理しなくても問題ないみたい。

尚、『IGraphBuilder』内の処理は、非アクティブ時に
アクティブ化するために色々発行するようだ。
アクティブだと何も発行しない。

「結局『DirectX Graphic』って関係ないの?」
と聞かれると、多分あまり関係ないかと…。

「だったらタイトル何よ!」
って突っ込みは、忘れて頂戴…。(汗)

『WM_ACTIVATE』で色々処理すると不具合を喰らうようなので
フラグをコピーするに留めておくが吉かと…。

またムービー再生中に画面モードを切り替えると
ムービー再生タスクが2・3個死ぬ。
この死んだタスクは再び起動されるのだがそれまでの間
数秒間ムービーが停止するのでハングしているように見える。

『DirectShow』でのフルスクリーン表示はディスクトップ全体を覆い
拡大表示しているので画面モードの切り替えが発生しない。
従ってフルスクリーンとウインドウの切り替えが高速でタスクも死なない。

なので画面モードを切り替えてフルスクリーンにしている時に
ムービー再生を行っている際に外部入力による強制ウインドウ化には、
どう対処すれば良いか?

ムービーを停止し開放してからウインドウへ切り替えるのが吉なのでは?

少なくてもそれしか考え付きませんでした…。

もしかしたらとっても勘違いしているかも知れません…。(汗)

間違いがあったら遠慮なく突っ込んでぇ~!

|

« 武者カーネル現る! | トップページ | 無限プチプチ ぷち萌え(ツンデレ編)釣った♪ »

コメント

yomogiさん
コメント有難うございます。

>上手くいきました!
おめでとうございます。

お役に立てて何よりです。

気が向いたら他の記事でも読んでくだされ♪(笑)

投稿: kouyou | 2009年3月17日 (火) 23時31分

この記事の内容を参考にフルスクリーン切り替え時に
DirectShowを一度SAFE_RELEASEして、再度設定しなおしたところ
上手くいきました!
良い情報を提供していただいて本当にありがとうございます!
おかげでフルスクリーンに切り替えてのムービー再生が可能になりました

投稿: yomogi | 2009年3月17日 (火) 22時19分

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: 『DirectX Graphic』と『DirectShow』の狭間で…:

« 武者カーネル現る! | トップページ | 無限プチプチ ぷち萌え(ツンデレ編)釣った♪ »