2

コンテキスト: waveOut ハンドル (HWAVEOUT) の値を認識するコードがあります。ただし、コードはハンドルを作成しなかったため、ハンドルの作成時に waveOutOpen に渡された WAVEFORMATEX は不明です。

waveOutOpen 呼び出しに渡された WAVEFORMATEX 構造体の内容を調べたいと思います。

これが使用される場所の詳細: コードは、waveOutWrite の代わりに呼び出されるフック関数で実行されます。したがって、コードはハンドル値を認識していますが、ハンドル作成の詳細は認識していません。

人々が調べる必要がないように:
waveOutOpen の署名は次のとおりです。

MMRESULT waveOutOpen(
  LPHWAVEOUT phwo,
  UINT uDeviceID,
  LPWAVEFORMATEX pwfx,
  DWORD dwCallback,
  DWORD dwInstance,
  DWORD fdwOpen
);

waveOutWrite のシグネチャは次のとおりです。

MMRESULT waveOutWrite(
  HWAVEOUT hwo,
  LPWAVEHDR pwh, 
  UINT cbwh
); 

注: waveOutOpen もフックしていますが、フックを作成する前に既に呼び出されている可能性があります。

4

2 に答える 2

1

Wave API からこの情報を取得することはできません。ウェーブ デバイスを開いた人から取得する必要があります。

を使用して再生速度を取得できますwaveOutGetPlaybackRate()。それを知っていれば、(理論的には) 既知のサイズのバッファーを再生するのにかかる時間を計測することで、セル サイズを知ることができます。(0 は常に無音です) しかし、8 ビット ステレオは、16 ビット モノラルと同じ再生時間がかかります。フロート/32 ビット モノおよび 16 ビット ステレオと同じです。

99% の確率で 16 ビット ステレオが正しい答えであると言えますが、推測が間違っている場合、結果は非常に悪い (そしてうるさい!) ため、推測するのは得策ではありません。

waveOutMessage()を使用してカスタム メッセージを Wave ドライバーに送信することもできます。custom_query_wave_format メッセージがある可能性はありますが、標準で定義されているようなメッセージはありません。誰が wave デバイスを開いたとしても、どのフォーマットで開いたかを追跡していると想定されています。

于 2009-12-25T02:14:19.577 に答える
0

他の構造体にアクセスする場合と同じようpwfxに、構造体の項目にアクセスします。waveOutOpen

myWaveOutOpen.pwfx.wFormatTag

または、お使いの言語の同等の形式。

あなたの質問はわかりにくいです。何が欲しいのかわからない…?

于 2009-12-22T18:24:00.580 に答える