foobar2000コンポーネント開発メモ

foobar2000用のコンポーネントを自作して使っている。

内容は、再生回数、履歴、最後に再生した日時の管理、自宅サーバへの再生履歴の送信、iPodとの再生履歴の同期、レート付けくらいである。

あまり、日本語の情報がないので、ポイントになったところを断片的にではあるが、書いていこうと思う。

開発環境は、Microsoft Visual Studio 2010 Express のVC++を使っている。開発環境の構築については、詳しく書かれた参考になるサイトがあるので、省略する。

初回は、playback_callbackの作り方と、登録の仕方についてである。

再生対象のトラックデータを取得できて、新しいトラックが再生を開始するとイベントを取得できたりと、使いやすいクラスではあるが、個人的にエラーに悩まされたので、その部分について書いておく。

SDKのplay_callback_impl_baseクラスを継承し、使いたいイベントについてフラグを立ててそのイベント用の関数をオーバーライドすれば自作のplayback_callbackを動かすことができる。

しかし、再生対象のトラックを指す、metadb_handle_ptr型の変数は、on_playback_new_trackの引数でしか入ってこないため、他のイベント(on_playback_timeやon_playback_stopなど)でこれを使うためにはクラス変数としてこれを保持していなければならないと考えた。

そして、クラス変数にmetadb_handle_ptr型の変数を加え、on_playback_new_trackでコピーして、内部で使っていた。

しかし、デストラクタでメモリエラーになるのか、foobar2000終了時にエラーが出る。コンポーネントの登録方法が間違っているようだった。

最初は、

static play_callback_static_factory_t mypb;

というコードを書いて、オブジェクトを作っていたのだけれども、このオブジェクトのアンロードがfoobar2000終了時に正常に行われていないようだった。

そして、

my_playback *mypb;

class playback_init_quit : public initquit {
public:
void on_init() {
if (!mypb) {
mypb = new my_playback();
}
}

void on_quit() {
delete mypb;
}
};

static initquit_factory_tg_playback_init_quit_factory;

という形を調べ、この形でオブジェクトの生成からアンロードをするようにしたところ、エラーは出なくなった。

私自身、C++の全仕様を把握していないし、理解もしていない。なぜ、この形にしたら正しく動いているように見えるのかもわからないけれども、問題が見た目上解決した、ということで、次回に続くことにする。

コメント