foobar2000のおはなし 第4話

foobar
今はこんな感じです。
だいぶしっくり来るようになってきました。

foo_input_matroskaの話。
ワイルドカードの扱いについて。
0.9.2.0でAttachmentへの透過アクセスを実装したわけですが、通常版のfoo_uie_albumart等でワイルドカードが使えません。
ワイルドカードのマッチングは、通常のファイルの場合はWin32API(FindFirstFile())がワイルドカードを受け付けてくれるんですが、自前の場合は目的のディレクトリ内のファイル名と1つずつ比較する必要があります。foo_input_matroskaはfoobar2000SDKのfilesystem::list_directory()でAttachmentのリストを返すようにしていますが、foo_uie_albumartを含むほとんどのコンポーネントはFindFirstFile()でディレクトリを走査しているため、ワイルドカードが利かないということになります。
書庫内のワイルドカードが実装されていないのも同じ理由で、さらに書庫の場合はarchive::list_directory()ではファイル名のリストを得られないため、gfngfgf氏もなかなか実装することが出来ないんだと思います。(一応archive::archive_list()ってのもあるんですが、これは引数に渡すarchive_callbackを自前で実装しなきゃいけないのでかなり面倒だったりします。list_directory()はdirectory_callback_implがあらかじめ用意されてるんですけど)
まぁこればっかりはちょっとこちら側ではなんともしがたい問題ですね。
なんとかしようとすればFindFirstFile()をフックとか...いやさすがにそこまでは(;´Д`)

foobar2000のおはなし 第3話

foo_input_matroskaの話。
flacやttaのmkaをfoobarでデコードすると1サンプル短くなってしまうファイルがある問題について。
まずflacのほうですが、これはmkvmergeがSegmentInfo::Durationを正確に入れてくれないのが原因です。Duration計算の段階で四捨五入しなければいけないところを切り捨て(キャスト任せ)ているため、1サンプル足りないDurationが格納されるファイルが出てきます。foo_input_matroskaは最後のChapterの終了時間をこのDurationから持ってくるので、デコード結果が1サンプル短くなります。mkvextractはこのDurationは見ないでBlockを1個ずつ足していくので、削れることはありません(格納段階でBlockに欠損は無し)。foo_input_matroska側での対処はちょっと難しい(いちいちBlock1個ずつ見てるとパースに時間かかってしまう)のでmkvmergeの修正待ちということになりますが、今まで直されていないところを見ると、こちらから報告しないと直らない予感もします...
ttaのほうは、正直よくわかりません。末尾手前のBlockをデコードすると1サンプル足りないPCMが出てくるという謎現象が発生したりしまして、これが恐らく、一般に言われる「mkaからttaを取り出すと1サンプル足りなくなる」問題の正体だと思います(mkvextractはデコードしないけど)。これに加えて上記のDurationが正確でない問題も起こるので、ttaの場合はfoobarでデコードすると2サンプル足りなくなることもあります。格納されているBlockは素のttaのフレームと同じ構造で、比較しても一緒のデータなので、mkaにする段階で欠損しているということはないようです。今のところデコーダ自体が怪しいんじゃないか(ttaファイルのデコーダとは別なので)と思っていますが、欠けるBlockが必ず最終Blockの1つか2つ前だったりして、さっぱり原因不明。foo_input_ttaの性能自体は結構優秀なので、この問題はさっさと解消したいところなんですけど、mkvextractでもダメなので先行きは厳しいです。
ちなみにWavPackはDurationの問題もありませんので、正確にデコードしてくれます。

foobar2000のおはなし 第2話

foo_input_matroskaの話。
というわけで公式のほうで0.9.1.0をリリース。
外部からパーサにアクセスできるようにcontainer_matroskaとしてサービス化できました。使い方はtxtかfoo_utils_matroskaを参考に。Attachされた歌詞ファイルの表示なんかを想定してます。
残り手を入れる部分としてはタグ周りでしょうか。
ID3やAPE Tag、OggやFLACのタグとの違いでやっかいな点は、matroskaはタグも階層構造で保持することです(EBMLですから)。foobar2000のインターフェイスでは平面のタグ付けしかできないので、読み出しはともかく書き込みには一工夫必要です。今のところはALBUMのプリフィックスがあるとアルバムタグ...とかやってるようですが(この辺あんまり手をつけてない)。専用インターフェイスがmatroska的にはベストなんでしょうが、ユーザーからすれば既存のI/Fで管理したいですしね。
あとは再生時のパースをもっと高速化したいところ。Clusterのパースに一番時間食ってるんですが、これ何とかなるんだろうか。Clusterは数が多いので時間かかって当たり前なんですけどね...

foobarのおはなし 第1話

foobar
今使ってるfoobar2000はこんな感じ。
あとサイドバーとしてPlaylist Treeが出るようになってます。
Tabbed Panel Stackが0.9で使えるようになったみたいなので、歌詞表示でもさせようかとも思うんですが、手持ちの歌詞ってないんですよね...

foo_input_matroskaの話。
まだリリースしてませんが、手元のバージョンではAttachmentの取り出しとpregap(INDEX 00)のtechinfo表示に対応してます。
パーサをサービス化して、他のコンポーネントからmatroskaの情報を参照できるようにしたいんですが、ちょっと時間かかりそう。先にリリースしたほうがいいかな...?これが出来ればalbumart_mkaからmatroskaのライブラリを切り離せるんですが。
それと、いくつかのサイトで言及されていたらしい、0.8.3でつけたタグが読み込まれない現象なんですが、Editionについてるタグを読み込まなくなったのが原因みたいですね。わたし該当箇所いつ消したんだっけな...
matroskaのタグ仕様として、SimpleTagの帰属先はTargetValueでのみ判断するみたいなので、この辺の処理も一度手を入れなきゃいけませんね。0.8のタグも読み込みくらいはさせとかないと。

foobar x matroska

最近やっていることは、曲作りでも卒制でも就活(泣 でもなく、foobar2000のコンポーネント(プラグイン)作りだったりします。
foobarのバージョンが0.9になったとき、Matroskaという形式のファイルが再生できなくなったので、再生用コンポーネントを勢い余って自分で0.9対応にしてしまったのが事の発端です。
その作業でコンポーネントの作り方を把握したので、面白がって自分が欲しいものをちょこちょこ弄ったり2chで公開したりしてたんですが、本家(?)Hydrogenaudio(海外のデジタルオーディオ専門フォーラム)にレスしたのがきっかけでMatroska公式の人に目をつけられ(笑、その流れでなぜかMatroska公式のメンテナになってしまったわけです。

わたしプログラマじゃないんですが...

こんな嗜み程度しかこなしてない自分(しかも英語苦手ときた)がデジタルマルチメディアの最前線のプロジェクトに足を突っ込んでいいものかいまだに悩みどころなんですが、かの妖精現実さんにお世話していただいたりしてなんとかなっちゃってます。
ていうか英語のIRCとかマジ緊張します、Haaliとかいう名前もあるし...MMORPG程度ならまだ何とかなるんですが(笑
そんなこんなで4月終わりくらいから結構C++相手にフル稼働という感じだったり。
この辺で弄ったものを置いたりもしてますので興味ある人はどうぞ。
foobar2000に関するネタとかもちょこちょこ書けるかもしれませんが、なんとなく需要はなさそうですか。

曲も書かないといけないんですけどー。