次の方法で共有


オーディオ データ ブロック

[このページに関連付けられている機能 、波形オーディオは、従来の機能です。 WASAPIオーディオ グラフに置き換わりました。 WASAPIオーディオ グラフは、Windows 10とWindows 11用に最適化されています。 可能な場合は、新しいコードで波形オーディオではなく WASAPIAudio Graph を使用することを強くお勧めします。 Microsoft は、レガシ API を使用する既存のコードを、可能であれば新しい API を使用するように書き換えるよう提案しています。]

waveInAddBuffer 関数と waveOutWrite 関数では、記録または再生のためにデバイス ドライバーに渡すデータ ブロックを割り当てる必要があります。 これらの関数はどちらも WAVEHDR 構造体を使用してデータ ブロックを記述します。

これらの関数のいずれかを使用してデータ ブロックをデバイス ドライバーに渡す前に、データ ブロックとデータ ブロックを記述するヘッダー構造にメモリを割り当てる必要があります。 ヘッダーは、次の関数を使用して準備および準備を解除できます。

機能 説明
waveInPrepareHeader 波形オーディオ入力データ ブロックを準備します。
waveInUnprepareHeader 波形オーディオ入力データ ブロックの準備をクリーンアップします。
waveOutPrepareHeader 波形オーディオ出力データ ブロックを準備します。
waveOutUnprepareHeader 波形オーディオ出力データ ブロックの準備をクリーンアップします。

 

オーディオ データ ブロックをデバイス ドライバーに渡す前に、 waveInPrepareHeader または waveOutPrepareHeader に渡してデータ ブロックを準備する必要があります。 デバイス ドライバーがデータ ブロックで終了して返されたら、割り当てられたメモリを解放する前に、waveInUnprepareHeader または waveOutUnprepareHeader にデータ ブロックを渡して、この準備をクリーンする必要があります。

波形オーディオの入出力データが 1 つのデータ ブロックに含まれるほど小さい場合を除き、アプリケーションは、再生または記録が完了するまで、デバイス ドライバーにデータ ブロックを継続的に提供する必要があります。

1 つのデータ ブロックが使用されている場合でも、アプリケーションは、データ ブロックとヘッダー構造に関連付けられているメモリを解放できるように、デバイス ドライバーがデータ ブロックで終了したタイミングを判断できる必要があります。 デバイス ドライバーがデータ ブロックでいつ終了するかを判断するには、いくつかの方法があります。

  • ドライバーがデータ ブロックで終了したときに送信されたメッセージを受信するコールバック関数を指定する
  • イベント コールバックを使用する
  • データ ブロックが完了したときにドライバーによって送信されるメッセージを受信するウィンドウまたはスレッドを指定します
  • 各データ ブロックで送信される WAVEHDR 構造体の dwFlags メンバー内のWHDR_DONE ビットをポーリングする

必要に応じて、アプリケーションがデバイス ドライバーにデータ ブロックを取得しない場合、再生に音声ギャップが発生したり、受信した記録された情報が失われたりする可能性があります。 これには、デバイス ドライバーの前に少なくとも 1 つのデータ ブロックを維持する、少なくとも 2 つのバッファリング スキームが必要です。

次のトピックでは、デバイス ドライバーがデータ ブロックでいつ終了するかを判断する方法について説明します。

コールバック関数を使用したドライバー メッセージの処理