foobar2000用のコンポーネントを作ってしまった

最終的には自作の音楽プレイヤーを作る決意を固めた。BASSライブラリを一式使えば、UIとメタデータの管理とiPod(+RockboxかAndroidのなにか)とのI/Fを作る&考えればいいからだ。

が、時間がかかりそうなのでとりあえずの間に合わせで、作りかけのfoobar2000のコンポーネントを完成?させてしまった。Visual Studio のExpress版での設定画面の作り方がよくわからないので、設定画面は無し。すべてソースに直書きして動くようにした。

iPodの履歴の取り込みは保留のまま、foobar2000で再生が終わったトラックの情報を自宅サーバへ送る、画面表示にも使っているSQLiteデータベースを更新する、というものを作った。一部おかしいが一応動いている。

調べてもわからなかったのが、標準のPlaybackインタフェースに、「トラックの再生終了イベント」というのが見当たらないことだ。実現しているコンポーネントはあるのだが、ソースが公開されていないので、どう実現しているのかがわからない。また、標準の「Playback Statisticsインタフェース」は、再生開始から1分で再生完了、としてしまうので、今までのiTunesでの管理とは違ってしまうので使いたくない。

ということで、再生開始後、1秒ごとに発生するイベントがあるので、これを曲長(Duration)と比較して、整数部分と一致したら再生完了、とする、というまぁまぁ妥当な処理を思いついた。

で、作り終えたので、曲長が短くギャップレスで曲数が多いアニメタルマラソンでテストをしているのだが、一部、処理できないものがある。Durationが、1分04秒041などの場合、このアルゴリズムでは1分04秒経過で再生完了となるのだが、1分03秒のイベントは発生するのに、1分04秒のイベントが発生しない。もちろん、この数値は一例であって、しきい値がどこにあるのかを確かめたわけではない。が、0.1秒以上Durationの端数があれば、少なくとも最後のイベントは発生し、また、0.05秒でも発生しているように見えている。そこで、今は、Durationとイベント発生時の経過時間(パラメータ)の差をとり、1.05未満であれば再生完了として処理するようにした。このしきい値を大きくしすぎると最後の(自分にとって正しい)イベントが発生してしまい、再生完了処理が2度走り、1度しか聴いていないのに2度聴いた事になってしまうのだ。

サーバ側のアプリは、一人で使っているのにマルチアカウント対応で作っていたこともあり、テストアカウントを作ってあっさり解決である。iTunesでBGMを聴きながら作業をして、C#版のアプリで正式アカウントにデータを送信。foobar2000の開発中のコンポーネントではテストアカウント宛にデータを送信する。正しく処理できているようだ。自宅サーバなので万が一ゴミが混じっても削除できる。

iTunes用の送信処理は別アプリとして作ったので、アプリのWindowにデータ送信時刻を表示していたが(記録としては残しておらず、起動中のみ表示)、foobar2000コンポーネントでは表示する部分が無いので(UIを提供するコンポーネントの作り方はまだわからない)、再生履歴と一緒にSQLiteのデータベースで管理して表示できるようにした。

ただ、SQLiteの処理が悪いのか、作りが悪いのか(使い方が悪いのか)、送信時刻が反映されない時がある。それも表示だけ。foobar2000を終了して(終了時にエラーがあるので、作りが悪いのかもしれないが、実行時にはエラーがでない)、次に起動すると正しくデータベースは更新されている。まぁ、個人で使うなら、使いながら修正してもいいだろう。今は、早くiTunesを「再生アプリとして使わなくする」ことが課題だ。

iPod用の処理はここまでできているとそれほど難しくはなく、foo_dopとのインタフェースが正しく取れているかと、iPodで再生したトラックの判定・収集を正しく行えるか、複数トラックの送信処理が行えるか、ということだけだ。HTTP通信の部分はバグがなければiPodの処理から複数トラックを渡せるような作りにしておいたので大丈夫なつもりでいる。

って、ここまで手間をかけて、さらにスクラッチから音楽プレーヤーを作ろうとしている自分は馬鹿なのかと思っている今日この頃なのであった。自作プレーヤーは再生機能自体はすぐだろうし、UIはほぼできている。メタデータの管理と自宅サーバ相手の処理もC#.NETで作るのでiTunes用と同じにできるから楽なのだ。ただ、ギャップレス再生処理と、foobar2000のメディアライブラリ管理のような、音楽ファイル管理処理をどう作るか?というところでいい案がでてこなくて、とりあえず、foobar2000で繋いでおこうという次第である。

とにかく、アルバム単位の、リプレイゲインが使いたいのである。

コメント