|
PlayPcmWin
WASAPI排他モードでWAV,AIFF,FLACファイルを再生するプログラムPlayPcmWinのページ
Featured English | 日本語 PlayPcmWinのページPlayPcmWinはWASAPI排他モードでWAV,AIFF,FLACファイルを再生するプログラムです。
特徴
PlayPcmWinはWASAPIの実験プログラムです。音楽を聴くのにもそこそこ使えるようになってきましたが、対応ファイル形式が少ないです。WASAPI排他モードで、いろいろなファイルフォーマットで保存されている音楽を聴きたい場合は、Foobar2000のfoo_out_wasapiプラグインを使うのが便利です。Foobar2000のfoo_out_wasapiプラグインは、WASAPI排他タイマー駆動モードで動作しているようです。 ダウンロード安定版 (バージョン 3.0.80)
非常にバグっぽい開発版
(バージョン3.0.52以降に備わっている並列読み込み機能は実験的機能でまだ不安定なことがあるようです。とりあえず無効にしておいたほうが無難です。) 32ビット版と64ビット版の違いについて
使用方法zipを展開して、中のSetup.exeを実行してインストールします。 インストール時に、マイクロソフト .NET Framework 4.0 Client Profileのインストールが必要になることがあります。 PlayPcmWinを開き、再生するWAVファイルを指定して、 使用する出力デバイスを選択し、再生ボタンを押します。 アンインストールは、[スタート][コントロールパネル][プログラムのアンインストール] または[プログラムと機能]で行うか、もう一度Setup.exeを実行して削除を選びます。 更新履歴こちらをご覧下さい。 http://code.google.com/p/bitspersampleconv2/wiki/PlayPcmWinChangelog 対応オーディオデバイスについてこちらをご覧下さい。 http://code.google.com/p/bitspersampleconv2/wiki/WasapiExclusiveMode 既知のバグ一覧最新版では修正された不具合も含めて全て表示: http://code.google.com/p/bitspersampleconv2/issues/list?can=1&q=&sort=-id&colspec=ID%20Type%20Status%20Summary MP3は再生できませんPlayPcmWinはMP3ファイルは再生できません。AAC、WMA、ALAC、DSDIFF等々の再生にも対応しておりません。 これらの形式のファイルはfoobar2000等の他の音楽再生ソフトを使用すると再生できます。 複数ファイルをエクスプローラーからPlayPcmWinにドラッグアンドドロップする際、エクスプローラーに並んでいる順番に再生リストに並べる方法方法1PlayPcmWin 3.0.20より、エクスプローラーから再生リストにドロップ後、再生リスト項目の任意の列をつまんで移動することができるようになりました。 PlayPcmWin 2.0.59より、エクスプローラーから再生リストにドロップ後、再生リスト項目(曲番号)をつまんで移動することができるようになりました。 方法2エクスプローラーの横幅を大きめに広げ、ファイル一覧を表示し、Altキーを押し、[表示][詳細]で詳細表示モードにします。この時点で、再生したい順番にファイルが並んでいることを確認します。並んでいない場合は、[名前]を何度かクリックすると整列すると思います。 先頭の曲をマウスでクリックして選択状態にします。 CTRLを押しながらAキーを押します。すべての曲が選択状態になります。 先頭の曲をマウスで選択し、PlayPcmWinにドロップします。 方法3エクスプローラーの横幅を大きめに広げ、ファイル一覧を表示し、Altキーを押し、[表示][詳細]で詳細表示モードにします。この時点で、再生したい順番にファイルが並んでいることを確認します。並んでいない場合は、[名前]を何度かクリックすると整列すると思います。 ファイル名表示が長すぎて行が画面の右端からはみ出ている場合は、項目名表示を縮めて、最も右側の項目が画面右端よりも左側にある状態にします。 マウスで一番下のファイル項目の下方か右側の何もないところをクリックし、クリックしたまま そこから上方向になぞってすべての項目を選択状態にします。 その後、最も上の項目をつまんでドロップします。 方法4CTRLを押しながら、エクスプローラー上の曲をマウスでクリックしていきます。 CTRLを離し、1曲目を選択してPlayPcmWinにドロップします。 .NET Framework 4.0 Client Profile(以下.NETと呼称)について.NETは、Windowsの機能を拡張するライブラリー群+プラットフォーム独立の実行環境というか、うまく説明できてませんが、 要するに、これを利用するとWindowsアプリケーションを作るのが簡単になるという物です。 PlayPcmWinでは、ウィンドウを出したり、マウスからの入力を処理したりするのに.NETを使用しています。 詳しくはこちらをご覧ください。知らないおっさんが出てきて丁寧に解説して下さいます。 http://msdn.microsoft.com/ja-jp/netframework/ee847315.aspx [再生]ボタンを押すと、[メモリ不足です…]が出る問題PlayPcmWinは音声データを全て仮想メモリに読み込んでから再生を開始します。 物理メモリが潤沢に利用出来る状態では、PlayPcmがアクセスする仮想メモリ空間が物理メモリにマップされます。 PCの搭載メモリ量が不足していて、しかも、スワップファイルの容量が大きめに取ってある場合、 PlayPcmWinが本来意図した動作にならず、PlayPcmWinの使用する仮想メモリ空間の一部がスワップアウトによって HDD上のページファイル内に置かれ、スラッシングが発生し、もっさりした動きになり、音切れが起きやすくなります。 目安としては、 32ビット版Windowsでメモリ3GB、64ビット版Windowsでメモリ4GBぐらいあると、PlayPcmWinはそこそこ使える状態になります。 32ビット版で、メモリ2GB以下の場合、PlayPcmWinはCD1枚分のプレイリストも扱えず、 あまり使い勝手がよくないです。 [ここまで一括読み込み]機能を使用すると、再生時に一度にメモリに置く音声データを減らすことができます。 量子化ビット数24ビットの音源が再生できるはずのUSBオーディオデバイスで再生失敗する問題についてPlayPcmWinを起動し[詳細設定]の[WASAPIに渡すPCMデータの量子化ビット数]一覧から[自動選択]を選択すると再生できるようになるはずです。 なお[対応フォーマット]ボタンを押して出てくるテスト結果でSint24とSint32V24の両方が×になっている場合、そのデバイスとPlayPcmWinの組み合わせで量子化ビット数24ビット再生を行うことは出来ないです。 量子化ビット数32ビットのファイルが、あまり再生できない問題PlayPcmWinは、デフォルトの設定状態では、量子化ビット数32ビットのPCMファイルを再生する際に量子化ビット数32ビットのWASAPI Setupを試みます。 ところが、量子化ビット数32ビットのWASAPI Setupが不可能なオーディオIFは少なくありません。( WasapiExclusiveMode 参照) 量子化ビット数32ビットのPCMデータをスライスして、量子化ビット数24ビット相当の情報だけをWASAPIに渡し、量子化ビット数24ビットのPCMデータとして再生したい場合は、
WAVファイルに曲情報を埋め込む方法Windows Media Player12でCDをWAV形式でリッピングするとWAVファイルに曲情報が入ります。 iTunes 10は、CDをAIFF形式でリッピングするとファイルに曲情報が入りますが、WAV形式でリッピングすると入りません。 WASAPI排他モードとWASAPI共有モードの違いについて
イベント駆動モードとタイマー駆動モードの違いについて
同じレイテンシ設定でも、イベント駆動モードの方がスレッドが起きる頻度が少なくてすみ、 CPU負荷が低くなります。 イベント駆動モードよりもタイマー駆動モードの方が動作する組み合わせ(オーディオデバイス、サンプリング周波数、量子化ビット数の組み合わせ)の数が多いです。 レンダー(再生)スレッドタスクタイプ"Audio"と"Pro Audio"の違いについてこれは、 AvSetMmThreadCharacteristics()関数の第1引数です。 この引数の説明はMultimedia Class Scheduler Service(MMCSS)の解説にあります http://msdn.microsoft.com/en-us/library/ms684247%28v=VS.85%29.aspx Pro Audioにすると、出力レイテンシーを10ミリ秒よりも短く設定した場合に 音切れの可能性が減るらしいです。 実際に試すと、あまり効果はありませんでした。 [設定なし]を選ぶと、再生スレッドはAvSetMmThreadCharacteristics()を呼びません。 この場合でも、スレッドの状態を観察すると、AvSetMmThreadCharacteristics()を呼ばなくても、IAudioClient::Initialize()呼出によって何らかのMMCSS的な処理が暗黙的に呼ばれているようです。 RME FireFace 400/800/UC/UFXやM-AUDIO ProFireでWASAPI排他モードを使うときのコツこれらのデバイスのドライバは、 WASAPIからデバイスのマスターサンプリングレートの変更ができません。 タスクトレイの「Fireface Settings」や「M-Audio ProFire」でマスターサンプリングレートを、再生するWAVファイルのサンプリングレートに予め設定してください。 Echo AudioFireシリーズも同様のようです。 Creative X-FiTiHDで44.1kHzと88.2kHzのイベント駆動再生ができない問題Creative X-FiTiHDは、44.1kHzサンプリングと88.2kHzサンプリングでWASAPI排他イベント駆動モードが使えません。 WASAPI排他タイマー駆動モードにすれば動きます。 理由はわかりません。PlayPcmWinのバグの可能性もあります。 RME FF400で出力レイテンシーをすごく短く設定したい場合WASAPI排他モードを使用します(共有モードでは30ミリ秒よりも短くできません)。 WASAPIイベント駆動モードを使用します(タイマー駆動モードの2倍のイベント間隔になり、 同じレイテンシーでもバッファーサイズを大きくできます)。 タスクトレイの「Fireface Settings」を起動し、Fireface(1)タブのBuffer Size(Latency)を小さい値にします。 レイテンシー設定の組み合わせと音切れの有無(44.1kHz 16bit stereo イベント駆動)
排他モードでデバイスを占有したまま「Fireface Settings」で、この設定をいじくっていると、BSODが発生しますがデバイスドライバの不具合でありPlayPcmWinの不具合ではありません。 出力レイテンシーを短く設定するのは、音切れの可能性が上がるので、おすすめしません。 3ミリ秒の設定では、再生中にエクスプローラーでフォルダーを開くだけで音切れします。音質以前の問題です。 出力レイテンシーを長く設定すると、再生スレッドのCPU負荷が軽くなります。 実行中のPlayPcmWinのバージョン番号を知る方法PlayPcmWinのメニューバーの[ヘルプ][バージョン情報]を選ぶと、バージョン番号が表示されます。 ビットパーフェクト(bit exact, bit match…)再生しているかどうか調べる方法デジタル出力の場合は、出力データをPCMレコーダーで録音して、録音後のWAVファイルと 元のWAVファイルをバイナリ比較することで、ビットパーフェクトかどうかを知ることができます。 ビットパーフェクト再生するためのコツ
DACが安定するまで無音を送出する機能これは、再生開始直後から音が入っている状態でPCMデータを送出すると、最初のほうのデータが捨てられ途中から再生される(ブチッという音がして再生が始まります)場合があるということで、再生開始後しばらくの間無音を送出して、意味のあるデータが捨てられないようにするという対策です。特にPCからデジタルで出し外付けDACやPCMレコーダーを接続する場合に比較的長い値(1秒程度)を入れる必要があるようです。 64ビット版Windows上で実行しているプログラムが64ビット版かどうか調べる方法CTRLを押しながらSHIFTを押しながらESCを押してWindows タスクマネージャーを開きます。 Windows タスクマネージャーの[プロセス]タブを開いて、イメージ名一覧を見ます。 名前の最後に *32と付いているものは 32ビット版のプログラムで、付いていないものは64ビット版のプログラムです。 ソースコード閲覧だけなら:
WASAPIの関数を呼び出しているところは、WasapiUser.cppにあります。 http://code.google.com/p/bitspersampleconv2/source/browse/trunk/WasapiIODLL/WasapiUser.cpp ユーザーインターフェースのコードは、MainWindow.xaml.csです。 http://code.google.com/p/bitspersampleconv2/source/browse/trunk/PlayPcmWin/MainWindow.xaml.cs ソースコードをコンパイルしてexeを作りたい場合
FLAC読み込み対応についてPlayPcmWin.exeがFLAC読み込み処理で使用しているFlacDecode.exeは libFLACの機能を使用しています。 libFLACのライセンスは New BSD Licenseです。 ライセンスの全文はここで読むことができます。 http://code.google.com/p/bitspersampleconv2/source/browse/trunk/PlayPcmWin/libFlacLicense.txt PlayPcmWinをインストールすると、デフォルトで C:\Program Files\yamamoto2002\PlayPcmWin\libFlacLicense.txt に同内容のテキストファイルがコピーされます。 ちなみにPlayPcmWin.exeのライセンスはMITライセンスです。雑誌掲載、無料配布、転載、コピペ、有料販売などを作者に無断で自由に行うことができるというようなライセンスだったと思います。ライセンスの全文 http://code.google.com/p/bitspersampleconv2/source/browse/trunk/PlayPcmWin/PlayPcmWinLicense.txt 量子化ビット数32ビットのFLACファイルの読み込みは対応しておりません。 これは、現時点でlibFLACが対応していないためです。 ファイルの並列読み込みについて詳細設定画面で[ファイル読込並列化]にチェックを入れるとファイル読み込み処理が並列化されます。デュアルコアCPU、クアッドコアCPU、ヘキサコアCPU等々でFLAC圧縮ファイルの読み込み時間が短くなります。しかし、ファイル読込並列化を有効にすると、FLAC読み込み時のCRCエラー検出が行われなくなります。libFLACの仕様でファイルのシークをするとCRCエラー検出フラグが下がるのが原因です。 再生スレッドの動作説明再生スレッドは、PCMデータをWASAPIに送るスレッドです。 WasapiUser.cppに書かれています。 全部で200行ほどの短いプログラムです。 http://code.google.com/p/bitspersampleconv2/source/browse/trunk/WasapiIODLL/WasapiUser.cpp#1353 再生スレッド 関数呼び出しグラフWasapiUser::RenderEntry()…………………… ※1 └WasapiUser::RenderMain()……………………※2 ├::CoInitialize()……………………………※3 ├::timeBeginPeriod()……………………… ※4 ├::AvSetMmThreadCharacteristics()………※5 ├::WaitForMultipleObjects()………………※6 ├WasapiUser::AudioSamplesSendProc()……※7 │├::WaitForSingleObject()……………… ※8 │├IAudioClient::GetCurrentPadding()… ※9 │├IRenderClient::GetBuffer()……………※10 │├WasapiUser::CreateWritableFrames()…※11 ││└::CopyMemory()…………………………※12 │├::memset()…………………………………※13 │├IRenderClient::ReleaseBuffer()………※14 │└::ReleaseMutex()…………………………※15 ├::AvRevertMmThreadCharacteristics()… ※16 ├::timeEndPeriod()………………………… ※17 └::CoUninitialize()…………………………※18
音声データ送信しているあいだ、再生スレッドは※6で起きて、※7~※15まで実行し、※6に戻って寝る、という処理を繰り返します。 WASAPI排他イベント駆動モードで、出力レイテンシー設定200ミリ秒の場合、※6~※15の処理を、1秒間に5回行います。 参考文献http://msdn.microsoft.com/en-us/library/dd370844%28v=VS.85%29.aspx | |||||||||||||||||||||||||||||||||||||||||||||||||||