4GB超メモリ環境で指定フィルタップ数の上限が19 その2

(4/17 用語間違い等を修正して更新)

 その1でフィルタップ数の上限問題を書いていたが、昨日次のような貴重なコメントをいただいた。

「Windows7 Ultimate 64bitでWaveUpConverterのタップ数を2{24}+1で使う。最初に必ずWUCcov.exe実行する前に、exeを右クリックメニューから互換性トラブルシューティングを実行して、推奨設定→設定保存→終了閉じて。再実行で2{24}+1が使えます。追加、WaveUpConverter.zipを、解凍してできたすぐのファイルでないと、意味が無いです。で既存のファイルは、削除して下さい。ちなみに メモリ8G PhenomⅡ 945 です。」

 あれ?実は互換性変更はして試したことがあったのだが、ポイントがあったらしい。”解凍してできたすぐのファイルでないと”とある。素直にやってみると...できた。たしかに24と出ている。前試したときは19までしか出なかった。素晴らしい!。では早速試してみるか...とおもいきやWAVファイルをドラッグ&ドロップできない。
 まるでXPモードでの現象である。なんどやってもだめ。せっかくここまでできたのに....WaveUpConverterの入力インターフェイスがドラッグ&ドロップだけというのがなんとめうらめしい。互換性を変更すると使えないのか。
 しかしここでふと、さきほどの”解凍してできたすぐのファイルでないと”を思い出した。これはどういうことだろうか。ダウンロード直後と、1回使用後の違いといえば、思い当たるのが設定ファイルである。すでに1回使用済みのEXEに対して、同じディレクトリにある設定ファイルwuc_setting.iniを削除してから、コメントにあった互換性トラブルシューティングを実行すると、解凍直後ではないが起動し、フィルタップ数も24が選択できる。しかし、ドラッグ&ドロップができないのは変わらず。

 というわけで設定ファイルwuc_settings.iniに注目して、今一度眺めてみる。互換性を設定せず実現できる方法がないものか。「MaxFilterTap=19」というのが最大フィルタップを決めているが、手動でたとえば24とかに変更しても、次回の起動時に自動的に19に戻される。
 空きメモリの算出が間違っているんだよな~きっととおもいつつ再度見直すと最初の設定項目に怪しいものがある「MemMargin=300」。ソースをみるとその名前のとおり、空き物理メモリ量取得でのマージンとして使用されている。ここで空きメモリの取得として使われているのが、GlobalMemoryStatus関数であるが、MSDNのページには次のようにある。

「4GB を超えるメインメモリを実装したコンピュータでは、GlobalMemoryStatus 関数は誤った情報を返す可能性があります。」
「4GB を超えるメインメモリを実装したコンピュータでアプリケーションを実行する可能性がある場合は、GlobalMemoryStatusEx 関数を使ってください。」


 そういうことか!とわかったものの、ビルド環境を作るのはめんどくさい。そこでソースをじ~っと眺めてみると、あの「MemMargin」が役に立つかもしれないことに気がついた。フィルタップ数が(間違った)空きメモリに対して大きすぎると判断するこの判定を逆にするためには....マイナスにしてあげるとよさそうと以下のように設定ファイル書き換えた。MemMargin=-700、そしてMaxFilterTap=25

 結果はこのとおり、Windows7 64bit、メモリ8GB環境で、互換モードなしのWaveUpConverterでも、フィルタップ数はFUSEでは可能であったが、WaveUpConverterではこれまで見たことのなかった未踏の25が、そしてWAVファイルのドラッグ&ドロップもでき、もちろんアップサンプリングも無事終了した。

 
 そして、前回の比較表に処理時間を追加してみた。結果は仮想環境とほぼ同じであったが、仮想環境で多発したエラーが出ていないのがうれしい。処理時間は今度もっと演奏時間が長いもので比較してみよう。比較での安定性はまだまだ実績が少ないため二重丸とはできなかった
 しかしこれで少なくとも旧マシンとほぼ同じアップサンプリングの環境が、しかも大幅な時間短縮をもって実現した。しかしまだWASAPIで24bit176.4KHzが再生できないという大きな障害が残っている...

 最後にコメントの書き込みありがとうございます。いろいろなことがヒントになります。