fc2ブログ

Keisuke's TwittPlayNow for WMP 1.50 リリース (2012/02/04)

公開日 : 2012/02/04 (土)
コメント : 0 件 | カテゴリ : リリース告知
<< ブログトップ >>

新作ソフト開発の合間を縫って Keisuke's TwittPlayNow for WMP のバージョンアップを行いました。

今回はバージョン 1.34 → 1.50 となり、少し大きなバージョンアップとなります。

バージョン 1.34 からの変更点は多岐にわたり、多くはクリップ情報取得を担うバックグラウンド プラグインの動作仕様変更が関わっています。

まず、バックグラウンド プラグインは動作の見直しを行っております。ソース コードを見たことがある方ならお分かりいただけると思いますが、バージョン 1.34 まではプラグイン初期化時に専用スレッドを作り、これを Sleep() 関数と終了フラグ併用でループさせる形で監視を行っていました。

しかし、コアとなる WMP プラグイン コードはウィザードで生成されているが故に、その中に専用コードを書いていたため、不定のタイミングで WMP が異常終了してしまうことがありました。

これを受けて、新作ソフト開発と並行して不具合解消方法を模索した結果、監視用スレッドとそのソース コードを新規ファイルにて一から作り直すことに決め、自動生成されたプラグイン部分は自動生成された当時ほぼそのままの状態に戻したうえで、別のソース コードを作ってコードを独立させることによってプラグインの読み込み、アンロード部分を担うコードを必要最小限にとどめました。

メインとなる部分を先述の新規に作った空のソース コードの方へ書き直すと同時にスレッドの動作周りの改善も行いました。(あとコード整理も兼ねています。)

まず、監視用スレッドは Windows 用アプリを作るのと同じ要領で独自のウィンドウ クラスとウィンドウ プロシージャを作り、それに任せるようにしました。(この部分は一般的な Windows アプリと同じ原理です。)

ただ、違うのはウィンドウ表示は不要であるためにその処理を省いている点と、いわゆる WinMain() 関数内ではなく、監視用スレッド上で WinMain() 関数に近い動作をさせることによって読み込みとアンロード処理もカバーしています。(つまり、プラグイン読み込み処理時にスレッドを開始・初期化させ、アンロード時にスレッド終了を待ってもらう → ウィンドウ クローズ リクエスト送信 → スレッド終了 → プラグインアンロード の流れになるようにしています。)

また、タイミングによっては WMP の終了処理とクリップ取得処理が重なってしまい、取得処理中にコアがアンロードされる恐れがあるため、WMP 向け COM インターフェース関数群を呼び出すたびにコアが生きているかを厳密にチェックすることによって不具合回避を行っています。(実はこの部分が異常終了の原因になっていました。)

上記の変更に伴い、クライアント側からもプラグインが読み込まれているかどうかの判別を可能にしています。

さらに、取得したクリップ情報をクライアントへ送る方法とタイミングの見直しも合わせて行っています。バージョン 1.34 まではクリップ情報が入ったデータを一時フォルダに一時ファイルに保存し、それの通知を受けたクライアント側から読み込ませることで通知を実現していましたが、バージョン 1.50 からはメモリ共有を採用しています。

これは万が一 HDD の空きがなかった場合に書き込みに失敗して通知に失敗するケースも十分にあり得ることやタイミングが悪かった場合に不完全にデータを取得してしまう恐れがあったため、一時ファイル方式からメモリ共有方式 + Mutex オブジェクトによる同期処理 (同時アクセス回避で不具合を防止する) に切り替えています。

これはメモリ共有の方が動作が若干高速化できるほか、プラグイン側、クライアント側双方で共有メモリに転送したデータをちょっとした手間ひとつで参照できるためです。(むしろそんな便利な API 群を何で今まで使ってこなかったのかが不思議なくらいです…)

あと、クライアントへデータ通知を送るタイミングも見直しています。従来のバージョンでは対象となる曲データが変化し、かつ開かれたことを検出した段階で通知を行っていたため、その時点で一時停止中だった場合もそのままクライアントへデータが送られてしまい自動投稿される場合がありました。

そこでバージョン 1.50 からは上記の判定に加えて、その時点で再生中か否かの判定を厳密に行うようになっています。このため、開かれたことが検出された時点で一時停止中だった場合、クライアントへのデータ通知処理は保留になり、一時停止解除時に改めて通知を送るようになりました。

上記の変更に合わせて、Twitter クライアント側も通知してきたデータを共有メモリから読みに行くようになり、処理が気持ちほどですが単純化しています。

クライアント側はプラグイン側の仕様変更に対応する程度の小変更に留まってはいますが、ログ表記の一部見直しや追加、ログ ウィンドウの下限サイズを設定したりと細かい部分で改善が行われているほか、Keisuke's Software シリーズでは伝統となっているあのバージョン情報機能をようやく搭載しました。

バックグラウンド プラグインにも実装していますが、こちらについてはプラグインのプロパティ機能を通じて実装しており、WMP 側のオプションウィンドウの [プラグイン] タブ → [バックグラウンド] → [Keisuke's TwittPlayNow for WMP] を選択して [プロパティ] ボタンを押すことで表示できます。

周辺ツールも機能強化が行われており、すでに常駐している Keisuke's TwittPlayNow for WMP と Windows Media Player を一括で終了リクエストを送る機能がプラグイン登録ツール側に追加されているなど、こちらも改良がおこなわれていますのでこの機会にぜひご利用ください。

あと、余談ですが UxTheme.dll の SetWindowTheme() API を用いることでリスト ビューやツリー ビューの外観を Windows Vista 以降のエクスプローラで使われているのと同じスタイルにできることがわかり、早速今回のバージョンからやってみました。

実はそのスタイルへの対応を以前からやってみたいと思っていて、やり方を模索していたところ、SetWindowTheme() API が浮上し、これを使ったところ簡単にスタイルが Vista 以降のものになったため、これを簡単にできるようにするためのラッパー関数を ksCommon.dll 側へ取り込みました。

新関数を追加した ksCommon.dll も近日一般公開予定です。(こちらは中 1 年ほどバージョンアップを行っていませんでした。)

コメント一覧

コメントする















管理人のみ確認可能にする

| ブログトップ |