Windows 標準の MP3 パーサでは VBR MP3 で正しい時間が表示されないのが気になった。さらに Vista では、一部のファイルの曲名が正しく取得できない問題も発生している。代わりに mpg123dsf のバグを修正して使ってみたが、ID3v2.2 に対応していないことに気付いた。ID3v2 バージョン差異、id3v2-00 - ID3.org を参考に、ID3v2.2 に対応させてみた。
nvplayer で音が出ない問題が発生。DirectShow Filter Tool で "mpg123 and MAD DirectShow Filter" (mpg123dsf.ax) のメリット値を下げて "ffdshow Audio Decoder" を優先して使うようにしたところ、nvplayer で音が出るようになった。MP3 を再生するときは、mp3parse.ax が優先して使われるため、デコーダは mpg123dsf.ax が使われることになる。
MP3 パーサだけは mpg123dsf の mp3parse.ax を使い、MP3 デコーダは ffdshow や Windows 標準のものが使えないかと思い、いろいろ試してみたがどうもうまくいかない。MPEG-1 メディア タイプ を見たところ、MPEG1WAVEFORMAT に適切に値を設定すれば良さそうな気がするが、MEDIASUBTYPE_MPEG1Packet と MEDIASUBTYPE_MPEG1Payload の違いが分からない。MEDIASUBTYPE_MPEG1AudioPayload というものもあるようだが、説明がない。MPEGLAYER3WAVEFORMAT という構造体もあるが、これはさらにまた別か?
逆に、パーサに Windows 標準のものを使い、デコーダに mpg123dsf.ax を使った場合は動くのだが。
PC が起動しなくなった原因を調査。やはり電源が壊れたようだ。ATX 電源検証ボードを使ってみたが、スイッチを押した瞬間に一瞬だけ電圧が上がるが、次の瞬間には電圧が 0V になってしまう。わずか1年半で壊れてしまうとは・・・。中を開けてみると、電解コンデンサが少し膨らんでいる。
新しい方のデスクトップの電源もちょっと気になる。ファンの音がちょっと怪しい。1ヶ月くらい前に電源を落としたときは、起動時にファンが回らず、チョップを入れたらようやく回り出した。
ついでに、ピポらなくなった Ra20 の電源も調べてみた。12V, 5.0V, 3.3V のいずれも正常だった。やはり、メインボードが逝ってしまったか。
CoRE PoWER Semi PLUG-IN 400W を \4,280 で購入。半プラグインというのがなかなかおもしろい。
TClock Light のソースコードを .7z 形式で圧縮していて気付いたのだが、ソースコードは、7-Zip 標準の LZMA よりも PPMd の方が圧縮率が良さそうだ。
古い方のデスクトップの電源が突然切れてしまった。電源が逝ってしまったような雰囲気。休みの間に調べるか。
未整理。
WinXP で TClock Light を使うと、設定画面の再生ボタンがクラシックスタイルになっているのが気になった。他のコントロールとの違いは BS_ICON が指定されていたこと。調べてみたところ、BS_ICON あるいは BS_BITMAP が ON になっているとクラシックスタイルで表示されてしまうらしい。オーナドローやカスタムドローを使って自前描画する必要があるらしい。(■MFC相談室 mfc17d.dll■の 916, 933 あたり)
Windows SDK 6.0 のリンカ (8.00.50727.762) では /WS:AGGRESSIVE は使えないようだ。
最近のキーボードは、再生、停止、ブラウザを開くなどの奇妙なボタンがたくさん付いたものがあるが、それらを押したときにどんなメッセージが送られてくるのか気になっていた。どうやら WM_APPCOMMAND というものが送られてくるらしい。smmp で対応させてみるのもおもしろいかもしれないと一瞬思った。
モノクロビットマップがツールバーに使えない件だが、リソースからビットマップを読み込んで、自前で色を置換しないと駄目だろうか? 関連しそうな情報を調べてみたが、実装するのはちょっと面倒くさそう。
もっと良い方法はないかと調べてみたところ、LoadImage() に LR_LOADMAP3DCOLORS というフラグがあることに気付いた。早速試してみたところ、Vista/XP/2k/98SE のすべてで意図した通りに表示された。
VC++ の link コマンドに、/WS:AGGRESSIVE というオプションがあることに気付いた。
smmp に使ってみたところ、タスクマネージャで見えるメモリ使用量は減ったが、動作速度に影響ないかがちょっと気になる。試した範囲では特に遅くなった感じはしなかったが、とりあえず今回はこのオプションは使わないことにした。
TClock のような常駐ソフトにはこのオプションが良さそうな気がする。「TClock Light開発中: タスクマネージャのメモリ使用量」では、SetProcessWorkingSetSize() を使って、メモリ使用量を減らすということをやっているが、/WS:AGGRESSIVE を使えば簡単に同じことができそう。
smmp のサイズをさらに小さくしてみようと思い、ツールバーのビットマップにモノクロビットマップ(正確には2色ビットマップ)が使えないか試してみた。色が反転したり、透過すべき色が透過していなかったりして、まともに表示されない。パレットの色をバイナリエディタで直接書き換えたり、色0と色1を入れ替えたりしたところ、Vista ではまともに表示されるようになったが、2k/98SE ではまともに表示されない。ビットマップファイルをいろいろいじったが、結局 Vista/2k/98SE すべてでまともに表示させることはできなかった。
CreateMappedBitmap() を使うと、色を差し替えたビットマップが作成できるようだ。早速、背景色を GetSysColor(COLOR_BTNFACE) に置換するようにしてみたところ、2k/98SE では意図した表示が得られたが、Vista では背景色に置換されていない。どうも、Vista ではモノクロビットマップに対して、CreateMappedBitmap() が使えないような感じがする。さらにいろいろ試してみたが、Vista ではモノクロビットマップに対して CMB_MASKED フラグを指定すると、プログラムが落ちてしまう。やはり怪しい。
CreateToolbarEx() ではなく、CreateWindowEx() を使ってツールバーを作る方法も試してみたが、表示に変化はなかった。
ActivePerl 5.10.0.1001 が公開されていた。とりあえずダウンロード。5.8.8.822 に比べると、パッケージファイルサイズが 1MB ほど減っているが、何が原因だろう? 5.10 に対応していないモジュールが削られたとか? まだインストールはしていない。
Perl 5.10 リリースに関する情報をいくつか。
Windows 用の Perl として ActivePerl 以外に Strawberry Perl というものがあるようだ。CPAN が使えるのが特徴らしい。
VS2008EE 日本語版 が公開されたようだ。DVD イメージもダウンロードできる。
VC++ で実行ファイルのサイズを小さくする技として、次のようなリンカオプションを使う方法がある。(undll.exe や smmp などでも採用している。)
/opt:nowin98 /merge:.data=.text /merge:.rdata=.text /section:.text,erw /ignore:4078
しかし、smmp の実行ファイルの中を見ると、無駄なスペースが大量に含まれていた。調べた結果、/merge:.data=.text を指定すると BSS セクションも .exe ファイル内に領域確保されてしまうことが判明。
smmp の実行ファイルサイズ削減を目論んで、ツールバー用のビットマップの圧縮ができないか試してみた。RLE 圧縮できるツールがあまり見当たらない。BMP To BMP を試してみたところ、ビットマップファイルのサイズが 1.6KB から 1.4KB に減少。
XP 用のマニフェストリソースのサイズも減らしてみることにした。文字コードは UTF-8 なので、encoding="UTF-8" は省略可能。language="*" も省略しても問題なし。改行もすべて削って、337bytes になった。なお、standalone="yes" は、省略すると standalone="no" と解釈されてしまうが動作は可能。standalone="yes" の方が解釈の効率が良いはずなので一応残しておく。これも削除すれば 320bytes。
軽量 MP3 プレイヤーをいくつか試してみた。
Win98 な Ls312 で実行すると、プレイリストに 1000曲近く登録していると遅い。リストの順序を簡単に並べ替えができるようにするつもりで std::list を使っていたが、ランダムアクセス性のほうが重要なので std::vector に変更。速くなったがファイルサイズ増加。STL はやめて自前で作るか?
smmp の実行ファイルを UPX で圧縮したらどうなるか試してみた。40KB が 23KB になった。かなり前のバージョンだと、元が小さすぎて圧縮できなかったような記憶があるが、残念ながら圧縮できてしまった。
Ghostscript をしばらく使わないうちに、最新版が AFPL Ghostscript から GPL Ghostscript にライセンス(と名称)が変更になっていたようだ。もしかして、レジストリも変更になっているのだろうか? そうだとすると、ifepsgs.spi の改造版も修正の必要がある。
Windows の自動更新について。
数年前に買った安物キーボードが壊れたので、新たに購入。SKB-SL09W を買った。コンパクトキーボードにはキー配置が奇っ怪なものが多いが、これはかなりまとも。Ins が単体ではなく Fn + Del で入力しないといけないのは多少気になる。あとは、カーソルキーが他のキーと少し離れていれば使いやすいのだが。
デバッグビルドの smmp 終了時に、TwinVQ フィルタから ASSERT メッセージが表示されてしまう原因がようやく判明した。smmp に追加したデバッグコードでリソースリークしていた。IBaseFilter::QueryFilterInfo() でフィルタ名を取得して表示していたのだが、FILTER_INFO の pGraph を解放していなかった。しかし、TwinVQ フィルタを使っていないときは、フィルタグラフごと綺麗に解放されていたように見えたのだが・・・気のせいか?
QueryFilterInfo() で取得した情報の解放には、BaseClasses の amfilter.h で定義されている QueryFilterInfoReleaseGraph() というマクロを使ってもよいようだ。
今まで TwinVQ フィルタは Vista で開発していたが、Win2k/XP で動くか確認してみた。最初、インストールの仕方をミスって動かずあせったが、やり直したら無事動作した。Win98 での動作も確認しようと思いつつ、まだやっていない。
先月の spam メールの集計結果。着信拒否にならなかった spam が少なくとも 2617通。そのうち、@nifty の迷惑メールフォルダーでも Spam Mail Killer でも spam として認識できなかったものは 9通(0.3%)。今月は spam がかなり多かった。中旬頃に迷惑メールフォルダーの誤判定が多かったが、@nifty 側で不手際があったようで、数日前にお詫びメールが来ていた。最近、SMK のすり抜けが増えてきた。そろそろ削除リストの見直しが必要か。