gypsy
User
 Senior Boarder
Posts: 19 |   | Karma: 0
|
Re:MP3録音ができません - 2009/07/13 16:42
こんにちは
Tapur の録音設定画面で問題の出るプライベートの PC 環境は acmFormatEnum() が MMSYSERR_INVALFLAG を返すことがあり フォーマットの列挙できないというのが現象の原因だったようです。 (それ以外のPC環境ではこのような挙動は確認できませんでした)
開示いただいたソースをもとにテストコードを書いて、 試行錯誤しているうちに安定した列挙ができるようになってしまったので これが原因だという箇所を断定することはできないのですが、 一応 NG だったケースについて挙げておきます。
■ acmFormatEnum() の第一引数のNULLにすると MMSYSERR_INVALFLAG を返す
MSDN には >このパラメータに NULL を指定すると、ACM は適切な ACM ドライバのうち最初のドライバの詳細を使います。 と書かれていますすが、問題の環境で第一引数を NULL にして acmFormatEnum() を呼び出すと 必ず MMSYSERR_INVALFLAG を返していました。 そのため、 acmDriverEnum() でまずドライバを列挙して、 それぞれのドライバについて acmDriverOpen() → acmFormatEnum() というように処理するようにしました。
■ acmMetrics() で取得したサイズの WAVEFORMATEX 構造体のバッファを確保して正しく初期化する
acmFormatEnum() には ACM_FORMATENUMF_CONVERT を指定して呼び出しますので、 ACMFORMATDETAILS 構造体の pwfx メンバに指定するバッファは変換元のフォーマットを指定します。 このバッファは同一内容なので、使いまわすようにしていると列挙が安定しないことがありました。 (実行するたびに列挙できなかったり、列挙できたりすることがある) acmFormatEnum() 毎に正しく初期化する必要があるようです。
あと、WAVEFORMATEX 構造体の cbSize メンバは 0 でなければなりません。
メールでテストコードのソースをお送りしておりますので参考になれば幸いです。
手元の環境では20回ほど試行して問題がでませんでした。 テストコードを xere さんの環境でもテストしていただければよいのですが...
|