2005年12月16日
Banshee概観
Bansheeのソースコードはとても読みやすい。複雑怪奇なMozillaとは大違い(笑)。おおざっぱなクラス図を書いてみた。
Bansheeのクラスは大きく四つに分けることができる。
- 音楽CDやiPodとのI/O
- 楽曲ライブラリ
- 楽曲再生エンジン
- ユーザーインターフェース
クラス図にあるAudioCdCore, HalCoreは音楽CDの挿入やイジェクトを管理。楽曲ライブラリ(Library)はSQLiteを使って楽曲情報を管理している。楽曲再生エンジン(IPlayerEngine)は設定によってGStreamer, HelixPlayer, VLCのいずれかを使う。GUI部分(PlayerUI)はGTKで作られている。iPodとのI/Oは調べていないのでよくわからない(iPodを持っていないので興味ナシ)。
主な動作は以下のような感じ。
- 音楽CDが挿入されるとHalCore - AudioCdCore - PlayerUIとコールバック関数が実行され、GUI上にCDの情報が出てくる。
- GUIで再生ボタンを押すと、指定されている再生エンジン(IPlayerEngine)を使って楽曲が再生される。
- トラック情報を編集し(TrackProperties)、保存ボタンを押すと、トランザクションクラス(TrackInfoSaveTransaction)のインスタンスが作成され、保存処理が実行される。トラック情報はSQLiteを使って管理されている。
クラスの構成にはあまり綺麗とは言えない部分もある。例えば楽曲の再生時。CoreクラスにIPlayerEngineクラスのインスタンスがpublic変数として定義されていて(activePlayer)、再生/一時停止ボタンが押されたときはこのactivePlayerのメンバ関数が直接呼ばれている。CoreクラスとPlayerUIクラスが互いに依存しあっている、私が毛嫌いしているパターンだ。Coreクラスがグローバル変数の集合体のようになってしまっている。クラス図には書かなかったが、BansheeCoreというクラスがPlayerUIとCoreを持ち、CoreもまたPlayerUIを持っているのも理解しにくい。
ともあれ、もう少し追いかけてみようかと思う。