foobar2000コンポーネント作成開始

foo_playcountをやめたので一から作ることにした。

foo_customdbを使うことも考えたけれども、作者が開発をやめてしまったようなので、将来的なことを考えると自作しておいた方が無難(作れるなら、ね)という判断をした。iPodコンポーネント、foo_dopとの連携も確実に取れるし。

ということで、まずは、レート、再生回数、最後に再生した日時を表示するところから作り始めることにした。

foo_customdbを真似してsqlite3を使うのが最終形態だろうとは思う。が、いきなりその形で作るのは無謀なので、まず、固定の値をfoobar2000に表示させるには?という基礎的な部分を作ってみた。

SDKの中で、metadb_display_field_providerクラスを継承したクラスを実装する。中身はメンバ関数が3つ。

get_field_count()、get_field_name()、process_field()の3つの関数。

最初の関数は自作のクラスが返すフィールドの数を返す。とりあえず固定で3を返すようにした。レート、再生回数、最後に再生した日時で3である。

次の関数はフィールドの名前を返すようである。indexがパラメータになっていて、0オリジンでTitleFormatで使う文字列を返せばいいようだ。とりあえず、foobar2000本体の設定を返すのが面倒だったので、foo_playcountと同じ、rating_stars_fixed, play_count, last_playedをそれぞれに対応させたが、一般公開することとなれば、メジャーなfoo_playcountと同じ文字列を使うのはまずいかもしれない。まぁ、とりあえず動作確認ということで。

最後の関数は、indexに対応して実際に表示する文字列を返せばいいようだ。戻り値がboolでtrueを返しておけば表示されるみたいだ。テストなので、固定文字列で試験している。play_countとlast_playedはそれぞれ、数値、日付の文字列なので半角英数記号で構成されるので問題はなかった。rating_stars_fixedが少々難しかった。

というのが、この関数で作成する文字列はUTF-8でなければいけない。なぜか、それがfoobar2000の流儀だからである。が、Visual Studio 2010で普通に文字列リテラルを書いてUnicodeを有効にするとそれはUTF-16になってしまう。だから表示されないのだ。変換が必要になる。次のようなコードを書いた。

char buf[256];
pfc::stringcvt::convert_wide_to_utf8(buf, sizeof(buf), L”★★★★★”, lstrlen(L”★★★★★”));
out->write( titleformat_inputtypes::meta, buf);
return true;

これをレートを出力しようとする部分に書いてやるとfoobar2000のColumn UIを使っているすべての曲のレート欄に星が5つ並んで表示された。白い星「☆」を混ぜればそのようになった。

クラスを作ったら、次のようなコードで登録をしなければならない。
static service_factory_single_t foo;

ということでsqlite3を使わない状態で固定の情報を出力することに成功した。次の段階として、これらの関数の中でトラックのメタ情報(タグ情報)にアクセスすることはできたので、それを使ってsqlite3のデータベースから情報を取ってきて出力するようにすればいいとは思うのだが、パフォーマンスがどれだけになるのかがわからない。

あと、コンポーネントを一から自作することにしたので、iTunesからrubyでsqlite3のテーブルを作成したらそのまま使えるようになるというのが大きい。変換しなくていいのである。iTunesのように、レートは20刻みで☆1つに対応させてしまえばそのまま使えるし、foobar2000→iTunesのエクスポートも将来楽になるかもしれない。

それにしても、プログラミングの情報が少なすぎる。iTunesの方がCOMやAppleScriptでやりたい放題だから楽なくらい。ある程度まで行ってしまえばパフォーマンスチューンになるのだろうが。

コメント