スポンサーサイト

--年--月--日 --:--

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Plex PX-W3PE 公式BonDriverについて

2011年02月07日 22:28

導入についての質問をコメントで頂いたので、公式BonDriver_W3PE(kumaさん版ではありません)とInterface_W3PE.dllについて、kumaさん版のソースを参考にしつつ調べてみました。

結論から言うと、Spinelのような1プロセスで同時に複数のBonDriverをロードするようなアプリケーションからは、おそらくまともに使用できないと思われます。
よって現状では公式版BonDriver_W3PEは非対応とさせて頂きます。

公式版BonDriver_W3PEが使えないのは何故ですか?

BonDriver_W3PEはInterface_W3PE.dllをロードし、そのインスタンスを生成してチューナの制御を行うわけですが、1つのInterface_W3PEインスタンスが同時に制御できるチューナは1個だけなのです。
さらにDLLのインスタンスというものは(同一のDLLファイル名である限り)1プロセスにつき1個しか生成できません。

BonDriver_W3PEを適当な名前にリネームして4個用意しても、そのBonDriverはInterface_W3PE.dllというファイル名のDLLしかロードしないため、4個のBonDriverは1個のInterface_W3PEインスタンスを共有する事になります。
1プロセスで4個のBonDriverを使って各々のチューナを同時制御しようとしても、どれか1つしかまともに動かない事になります。

EDCBやTVTest(RecTest)では問題無く使用できるのは何故ですか?

これらのアプリケーションは1プロセスにつき同時に1個のBonDriverしか使用しません。
複数チューナで録画したり視聴したりしたければその分だけ新規プロセスを起動する事によって対応するわけです。
プロセスを分ければその分だけInterface_W3PEインスタンスが生成されますから、上記の制限が障害になる事はありません。

ただしTVTestが(将来そのような機能追加があるかどうかは別にして)PinP等のマルチ画面同時視聴を実装するために、1プロセスで複数のBonDriverをロードしようとした時、この問題が大きな障害になると思われます。

似たような仕組みになっているBonDriver_PT-STは問題ないのかと思われるかもしれませんが、BonDriver_PT-STの場合はPTCtrl.exeのインスタンス1個だけで全てのPT1/2をコントロールできるように設計されています。
おそらくPlexの担当者はここまで考えてInterface_W3PE.dllを実装しなかったのだと思います。

BonDriver_W3PE_kumaだと問題無いのは何故ですか?

1プロセス内にDLLのインスタンスを複数生成するにはどうしたらいいかというと、単純にDLLをコピー&リネームして複数用意し、それらを個別にロードすればOKです。
勿論これ以外にも方法はありますが結構実装が大変だと思います。
余談ですがSpinelのBonDriverフォルダに、チューナの数だけBonDriverを用意しないといけないのはこのためです。
これに関してはまた機会があれば別に記事を書こうと思います。

さてkumaさん版(BonDriver_W3PE_kuma)は以下のようなアプローチで問題を回避しています。

  1. 操作したいPX-W3PEのチューナに付けられた一意な番号(以下チューナID)を取得します。
    具体的には0~7の値が得られ、これで2デバイス×4チューナ=8個のチューナを識別します。
  2. 文字列 Interface_W3PE にチューナIDを追加し、さらに文字列 .dll を追加したファイル名のDLLを探してロードします。
    つまりチューナID=0を担当するBonDriverはInterface_W3PE0.dllをロードし、チューナID=2を担当するBonDriverはInterface_W3PE2.dllをロードするわけです。
これで1プロセス内に複数のInterface_W3PEインスタンスが生成される事になります。
さらに各BonDriverのインスタンスには、それぞれ異なるInterface_W3PEインスタンスが1:1に対応付けられています。
それぞれ対応したInterface_W3PEインスタンスを個別に操作する事によって、1プロセスでもチューナを同時に制御する事が可能になります。

なんとかして公式版を使うにはどうすればよいですか?

要するに各々のBonDriverが同一ファイル名のDLLをロードしないようにすればいいわけです。
つまりロードするファイル名をどうにかして変えてしまえばOKです。
ロードするDLLファイル名を変えるにはどうすればいいかというと、BonDriver内に書かれている文字列をバイナリエディタで書き換えてやるのが手っ取り早い手です。

例えば"Interface_W3PE.dll"となっているところを、"Interfac0_W3PE.dll"等に書き換えてやります。
そしてオリジナルのInterface_W3PE.dllをコピーして、上記のファイル名にリネームします。
これをチューナ数分だけ繰り返せば、各BonDriverがロードするDLLは別々のものになり、理屈の上では何とかなるはずです。



コメント

    コメントの投稿

    (コメント編集・削除に必要)
    (管理者にだけ表示を許可する)

    トラックバック

    この記事のトラックバックURL
    http://lapislabs.blog24.fc2.com/tb.php/15-c1d72632
    この記事へのトラックバック



    上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。