KeyHoleTV開発者のブログ

日々の質問や開発の日記

KeyHoleTV開発秘話(その5)

Windows版KeyHoleTVの開発

前回(KeyHoleTV開発秘話(その4) - KeyHoleTV開発者のブログ)で、Windows版KeyHoleVideoの開発について、述べました。 最初は、.Net Framework を利用してましたが、それをあきらめ、全てをWin32 を用いてC,C++で開発を行いました。 KeyHoleVideoは、発信も受信もできるシステムですが、機能が多すぎるため、受信専用のアプリケーションが必要となります。 これがKeyHoleTVです。

KeyHoleTVは、KeyHoleVideoの開発で失敗した .Net Framework を利用しないで、Win32APIだけを使って開発することをめざしました。 しかし、ビデオの表示には、DirectXを利用する形式をとっていました。

計算機の種類によるDirectXの動作のばらつき

KeyHoleVideoやKeyHoleTVで利用していたDirectXは、Direct2Dと呼ばれるもので、平面画像を扱うAPIです。 ビデオの表示には、別に3Dのレンダリングは必要ありません。 KeyHoleTVのアプリケーションの開発を進めて、利用者にリリースした時、 特定の計算機でビデオの表示をしない不具合の報告を受けました。 利用者が近所の住まわれていたので、 動かないKeyHoleTVを見せてもらいました。 すると、確かに動画が表示されません。 

DirectXには、診断用のプログラム dxdiag があります。 これは、計算機が持っているビデオカードの性能を調べるもので、 どのようになっているか分かるプログラムです。 計算機は、SONY製の日本仕様で、DirectX9を完全サポートと謳われているPCでした。

で、dxdiag で調べてみると、Direct2DのハードウェアアクセレレターがONになっていました。 他の機器では、ハードウェアアクセレレターがONになっていても、特に問題なく表示します。 しかし、SONY製のPCでは、表示されません。 試しにハードウェアアクセレレターをOFFにすると、KeyHoleTVの動画が正しく表示されました。

このようなPCの不具合は、日本製のPCでまれに起こる現象のようです。 著者は、SONY製のPCで一度、 東芝製のAndroidタブレットで表示の不具合を体験しました。 これは、想像ですが、DirectXは、MicroSoftが提供するAPIでそのAPIの性能を引き出すようなビデオカードの設計が行われます。 APIの性能を引き出すための設計は、 APIの仕様が変わった場合、十分に対応できません。 おそくらSONY製のPCは、DirectX9の仕様が完全に固まる前のAPIを利用したビデオカードの設計をおこなった結果だと思っています。 新商品には、仕様の優位性が販売の実績となることが多いため、 このような結果になったと思っています。 

東芝のタブレットもOpenGL2.0 の規格では、 任意の大きさの表示領域に対して、テキスチャの貼り付けができるとなっていますが、 東芝製は、横幅が4のべき乗になっていないと、テキスチャの貼り付けができません。 これも、ソフトの仕様が完全に決まる前に仕様の優位性を全面に押し出した結果だと思います。 ひょっとすると、SONY製のPCでも表示領域が前画面の場合などでは、うまく表示できた可能性があります。

SONY製の問題で、DirectXを利用する場合、アプリの挙動が保証できない場合あることが分かりました。 ハードウェアの問題なので、PCのメーカが対応できるデバイスドライバを出したりする可能性が低いことも想定できます。 そこで、KeyHoleTVとKeyHoleVideoは、DirectXを利用しないで、GDIだけで動画を表示するようにしました。

f:id:KeyHoleTV:20190713082347p:plain

DirectXを利用しないKeyHoleTV

ボタンなどの殆どの部品は、KeyHoleVideoで作ったプログラムを流用しています。 部品は、CやC++で記述されているので、単にテキストをコピー・ペーストすれば、そのまま利用できます。 また、開発には、VisualC++ 8を利用しました。 このGUIは、.Net Frameworkで構築したKeyHoleVideoのボタンやタブをWin32で実装しただけです。 文字列の表示は、GDI Plusを利用して、 その他はGDIを使っています。 GDIを使って表示しているので、音の大きさを表示する斜め線がギザギザになっています。 

現在のWindows版KeyHoleTVは、ボタンをすべてアイコンにしています。それが、

f:id:KeyHoleTV:20190717042851j:plain

ボタンをアイコン化したKeyHoleTV

上記の画像になります。 KeyHoleTVがオンラインかどうかは、左上の緑の丸で表現しています。 オフラインになると赤い丸になります。 また、KeyHoleTVのウィンドウが何時も一番上で表示を行う Top Most は、ウィンドウの絵のアイコンになっており、クリックすると、KeyHoleTVが他のウィンドウより下に表示されるアイコンになっています。 これらのアイコンは、透明色があるイメージです。 GUI Plusは、イメージ中の透明色を扱うことができます。 スライダーは、デフォルトの表示を使わず、KeyholeTVで表示していて、つまみをドラッグすると、音の大きさが変わります。 スライダーの動きに合わせて右側の音の大きさを表示するアイコンが変化します。 また、音の大きさを表示するアイコンをクリックすると、MUTE(消音)になります。

全ての部品は、C・C++のソースコードで記述されています。 部品一つ一つは、すべてWin32のCreateWindowで構築されたWindowで、Window自身を表示する処理を記述してあります。 表示する処理は、以前、背景の描画と文字列の描画を行っていましたが、現在は、イメージの表示にしています。 また、Windowの表示位置の変更を行っています。

また、KeyHoleVideoもKeyHoleTVの部品を使って、ボタンをできるだけ、アイコンにしました。

その変更を加えたKeyHoleVideoは、

f:id:KeyHoleTV:20190717114307j:plain

ボタンをアイコンにしたKeyHoleVodeo

上記の画像になります。 オンライン、オフラインを示すアイコン、TOP MOSTを示すアイコン、音の調整を行うスライダーなど、KeyHoleTVと共通しています。 これも、ボタン等の部品をC・C++のソースコードで記述しているのと、部品化する時、他のソフトでも利用可能なコードにしているため、簡単に移植可能になっています。

WindowsCEへの移植

VisualC++ 8は、作ったアプリケーションをWIndowsCEに移植できる仕組みがあります。WindowsCEは、GDI Plusの利用はできませんが、GDIを使うことができます。 また、GDI PlusからGDIへの変更は、 文字列の表示だけなので、比較的容易に変更可能です。 そこで、WindowsCE用のKeyHoleTVを作ってみました。

f:id:KeyHoleTV:20190713083529j:plain

古いWindows CE用KeyHoleTV

ボタンはタッチペンで押すインタフェースです。 WindowsCEには、画面をタップして操作できるタイプのデバイスには、タッチペンが付属していて、Windowsの基本操作もタッチペンで行います。 また、ナビゲーションボタンでも操作可能になっています。 表示しているGUIは、日本語のフォントがないため、日本語の表示ができていません。 

Windows XP以降、フォントは、国際化対応されていますので、どこの国で販売されているPCでも日本語の表示が可能です。 しかし、WindowsCEは、販売している国に特化しているようで、国際化のフォントがインストールされていません。 また開発環境でも、VisualC++に付属しているWindowsCEのエミュレータにもフォントが搭載されていませんでした。 当時エミュレータは、MicroSoftからフォントのダウンロードができて、日本語表示ができたようでしたが、エミュレータ用のフォントを実機にインストール出来なかったという記憶があります。  また、入力でも日本語など入力は、日本で販売されているWidnowsCEでしか動作しません。 ですから、たとえ日本語のフォントがインストールされていて表示可能でも、日本語の入力(かな漢字変換)は、欧米で販売されているWindowsCEでは、できなかったと思います。

 WindowsCE用のKeyHoleTVのボタン等をアイコン化は、通常のWindowsより困難になります。 一番の問題は、GUI Plusが利用できないことです。 このため、透明色をもったイメージの描画が通常のWindowsより難しくなります。 更に、日本の入力がWindowsCEが販売されている地域によってはできないため、通常のWindowを使ったプログラムでは、KeyHoleTVの実現が困難になります。

WindowsCE版KeyHoleTVのボタンのアイコン化は、アンドロイド用KeyHoleTVの開発を終了してから行いました。 通常アンドロイド用のアプリケーションは、JAVAを使って構築されています。 アンドロイドは、汎用OSで、CPUの種類を選ばないため、どの端末でもアプリが動作するための取り組みです。 しかし、JAVAを使うと、動画のデコーダの処理が重くなり、更に音のデコーダの処理が重くなってしまいます。 

利用者からアンドロイド用のKeyHoleTV開発の要請があったのですが、NDK(Android NDK)だけでアプリが作れるまで、開発を中断していました。 NDKだけのアプリで、画面表示を行う場合、OpenGL ESを利用する必要があります。 アンドロイド用に提供されている表示の部品は、NDKだけのアプリでは利用できません。 そこで、OpenGL ESを使った2Dのライブラリを作りました。 このライブラリには、ボタン、スライダー、スライドするページなどの表示用の部品があります。 また、かな漢字変換(3文字以上は、Googleに通信して漢字変換を行います。Google 日本語入力 - CGI API デベロッパーガイド)用の辞書やインターフェースも用意して、日本語入力が出きるようにしました。 PNGのイメージを表示する機能やFreeType のベクターフォントを利用して、日本語の表示も行えるようにしました。 このライブラリを WindowsCEに移植しました。 この結果、アンドロイド用KeyHoleTVのソースコードがそのまま利用できて、アンドロイドと同等な操作ができるようにしました。 これは、

keyholetv.hatenablog.com

に記載しています。

f:id:KeyHoleTV:20190717135226j:plain

現在のWindowsCE用KeyHoleTV

 

フレームバッファを利用して表示しているので、全画面表示になっており、Windowのタイトルバーや終了ボタンもありません。 また、ボタンやスライダーは、指でも操作できるようなっています。 自前でフォントやかな漢字変換を用意したので、販売している国に関係なく、日本語の表示や日本語入力も可能です。  操作感覚は、iPhoneやアンドロイドと同様で、ナビゲーションボタンも利用可能です。

 

KeyHoleTVのダウンロードやプレミアムモジュールキーのご購入は、

www.oiseyer.com

で。