オーディオ データ ブロック
[このページに関連付けられている機能 、波形オーディオは、従来の機能です。 WASAPI とオーディオ グラフに置き換わりました。 WASAPI とオーディオ グラフは、Windows 10とWindows 11用に最適化されています。 可能な場合は、新しいコードで波形オーディオではなく WASAPI と Audio Graph を使用することを強くお勧めします。 Microsoft は、レガシ API を使用する既存のコードを、可能であれば新しい API を使用するように書き換えるよう提案しています。]
waveInAddBuffer 関数と waveOutWrite 関数では、記録または再生のためにデバイス ドライバーに渡すデータ ブロックを割り当てる必要があります。 これらの関数はどちらも WAVEHDR 構造体を使用してデータ ブロックを記述します。
これらの関数のいずれかを使用してデータ ブロックをデバイス ドライバーに渡す前に、データ ブロックとデータ ブロックを記述するヘッダー構造にメモリを割り当てる必要があります。 ヘッダーは、次の関数を使用して準備および準備を解除できます。
機能 | 説明 |
---|---|
waveInPrepareHeader | 波形オーディオ入力データ ブロックを準備します。 |
waveInUnprepareHeader | 波形オーディオ入力データ ブロックの準備をクリーンアップします。 |
waveOutPrepareHeader | 波形オーディオ出力データ ブロックを準備します。 |
waveOutUnprepareHeader | 波形オーディオ出力データ ブロックの準備をクリーンアップします。 |
オーディオ データ ブロックをデバイス ドライバーに渡す前に、 waveInPrepareHeader または waveOutPrepareHeader に渡してデータ ブロックを準備する必要があります。 デバイス ドライバーがデータ ブロックで終了して返されたら、割り当てられたメモリを解放する前に、waveInUnprepareHeader または waveOutUnprepareHeader にデータ ブロックを渡して、この準備をクリーンする必要があります。
波形オーディオの入出力データが 1 つのデータ ブロックに含まれるほど小さい場合を除き、アプリケーションは、再生または記録が完了するまで、デバイス ドライバーにデータ ブロックを継続的に提供する必要があります。
1 つのデータ ブロックが使用されている場合でも、アプリケーションは、データ ブロックとヘッダー構造に関連付けられているメモリを解放できるように、デバイス ドライバーがデータ ブロックで終了したタイミングを判断できる必要があります。 デバイス ドライバーがデータ ブロックでいつ終了するかを判断するには、いくつかの方法があります。
- ドライバーがデータ ブロックで終了したときに送信されたメッセージを受信するコールバック関数を指定する
- イベント コールバックを使用する
- データ ブロックが完了したときにドライバーによって送信されるメッセージを受信するウィンドウまたはスレッドを指定します
- 各データ ブロックで送信される WAVEHDR 構造体の dwFlags メンバー内のWHDR_DONE ビットをポーリングする
必要に応じて、アプリケーションがデバイス ドライバーにデータ ブロックを取得しない場合、再生に音声ギャップが発生したり、受信した記録された情報が失われたりする可能性があります。 これには、デバイス ドライバーの前に少なくとも 1 つのデータ ブロックを維持する、少なくとも 2 つのバッファリング スキームが必要です。
次のトピックでは、デバイス ドライバーがデータ ブロックでいつ終了するかを判断する方法について説明します。
コールバック関数を使用したドライバー メッセージの処理
- コールバック関数を使用したドライバー メッセージの処理
- イベント コールバックを使用したドライバー メッセージの処理
- ウィンドウまたはスレッドを使用してドライバー メッセージを処理する
- ポーリングによるデータ ブロックの管理