次の方法で共有


デバイスとデータ型

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

このセクションでは、波形オーディオ デバイスの操作について説明し、その機能を開き、閉じてクエリを実行する方法について説明します。 また、デバイス ハンドルとデバイス識別子を使用して、システム内のデバイスを追跡する方法についても説明します。

Waveform-Audio出力デバイスを開く

waveOutOpen 関数を使用して、再生用の波形オーディオ出力デバイスを開きます。 この関数は、指定したデバイス識別子に関連付けられているデバイスを開き、指定したメモリ位置のハンドルを書き込んで、開いているデバイスのハンドルを返します。

一部のマルチメディア コンピューターには、複数の波形オーディオ出力デバイスがあります。 システムで特定の波形オーディオ出力デバイスを開く場合を除き、デバイスを開くときにデバイス識別子にWAVE_MAPPER フラグを使用する必要があります。 waveOutOpen 関数は、指定されたデータ形式を再生するのに最適なシステム内のデバイスを選択します。

オーディオ デバイスのクエリ

Windows には、システムで使用できる特定の種類のデバイスの数を決定する次の機能が用意されています。

機能 説明
auxGetNumDevs システムに存在する補助出力デバイスの数を取得します。
waveInGetNumDevs システムに存在する波形オーディオ入力デバイスの数を取得します。
waveOutGetNumDevs システムに存在する波形オーディオ出力デバイスの数を取得します。

 

オーディオ デバイスは、デバイス識別子によって識別されます。 デバイス識別子は、システムに存在するデバイスの数から暗黙的に決定されます。 デバイス識別子の範囲は、0 から存在するデバイスの数より 1 未満です。 たとえば、1 つのシステムに 2 つの波形オーディオ出力デバイスがある場合、有効なデバイス識別子は 0 と 1 になります。

システムに存在する特定の種類のデバイスの数を確認したら、次のいずれかの関数を使用して、各デバイスの機能に対してクエリを実行できます。

機能 説明
auxGetDevCaps 指定した補助出力デバイスの機能を取得します。
waveInGetDevCaps 指定した波形オーディオ入力デバイスの機能を取得します。
waveOutGetDevCaps 指定した波形オーディオ出力デバイスの機能を取得します。

 

これらの各関数は、指定されたデバイスの機能に関する情報を構造体に格納します。 次の表に、これらの各関数に対応する構造体を示します。

機能 構造体
auxGetDevCaps AUXCAPS
waveInGetDevCaps WAVEINCAPS
waveOutGetDevCaps WAVEOUTCAPS

 

標準書式は、WAVEOUTCAPS 構造体の dwFormats メンバーに一覧表示されます。 波形オーディオ デバイスでは、非標準形式をサポートできます。 特定の形式 (標準または非標準) がデバイスでサポートされているかどうかを判断するには、WAVE_FORMAT_QUERY フラグを使用して waveOutOpen 関数を呼び出します。 このフラグは、デバイスを開きません。 対象の形式は、waveOutOpen に渡される pwfx パラメーターが指す WAVEFORMATEX 構造体で指定します。

波形オーディオ出力デバイスは、サポートされている機能によって異なります。 WAVEOUTCAPS 構造体の dwSupport メンバーは、デバイスがボリュームやピッチの変更などの機能をサポートしているかどうかを示します。

デバイス ハンドルとデバイス識別子

オーディオ デバイスを開く各関数は、デバイス識別子、メモリの場所へのポインター、および各種類のデバイスに固有のパラメーターを指定します。 メモリの場所には、デバイス ハンドルが格納されます。 このデバイス ハンドルを使用して、他のオーディオ機能を呼び出すときに開いているオーディオ デバイスを識別します。

オーディオ デバイスの識別子とハンドルの違いは微妙ですが、重要です。

  • デバイス識別子は、システムに存在するデバイスの数から暗黙的に決定されます。 この数値は、 auxGetNumDevswaveInGetNumDevs、または waveOutGetNumDevs 関数を使用して取得されます。
  • デバイス ハンドルは、 waveInOpen 関数または waveOutOpen 関数を使用してデバイス ドライバーを開いたときに返されます。

補助オーディオ デバイスを開いたり閉めたりする機能はありません。 補助オーディオ デバイスは、波形オーディオ デバイスのように開いたり閉じたりする必要はありません。これは、それらに関連付けられた連続データ転送がないためです。 すべての補助オーディオ関数は、デバイス識別子を使用してデバイスを識別します。

出力データ型のWaveform-Audio

波形オーディオ出力関数には、次のデータ型が定義されています。

Type 説明
HWAVEOUT 開いている波形オーディオ出力デバイスにハンドルします。
WAVEFORMATEX 特定の波形オーディオ入力デバイスでサポートされるデータ形式を指定する構造体。 この構造は、波形オーディオ入力デバイスにも使用されます。
WAVEHDR 波形オーディオ入力データのブロックのヘッダーとして使用される構造。 この構造は、波形オーディオ入力デバイスにも使用されます。
WAVEOUTCAPS 特定の波形オーディオ出力デバイスの機能を照会するために使用される構造。

 

Waveform-Audioデータ形式の指定

waveOutOpen 関数を呼び出してデバイス ドライバーを再生用に開くか、ドライバーが特定のデータ形式をサポートしているかどうかを照会する場合は、pwfx パラメーターを使用して、要求された波形オーディオ データ形式を含む WAVEFORMATEX 構造体へのポインターを指定します。 WAVEFORMATEX はWAVEFORMAT および PCMWAVEFORMAT 構造体よりも優先されます。

2 つ以上のチャネルに分割されているオーディオ データ、または 8 の倍数ではないサンプル サイズのオーディオ データの場合は、 WAVEFORMATEXTENSIBLE を使用する必要があります。 この構造体は、単に WAVEFORMATEXcbSize メンバーが指す余分なバイトを構成して、形式に関する追加情報を提供します。 WAVEFORMATEXTENSIBLE、WAVEFORMATEX としてキャストできます。

オーディオ データを表すために使用できるクリップボード形式には、CF_WAVEとCF_RIFFの 2 つもあります。 CF_WAVE形式を使用して、11 kHz や 22 kHz PCM などの標準形式のデータを表します。 標準の波形オーディオ ファイルとして表すことができない、より複雑なデータ形式を表すには、CF_RIFF形式を使用します。

Waveform-Audio データの書き込み

波形オーディオ出力デバイス ドライバーを正常に開いた後、サウンドの再生を開始できます。 Windows には、波形オーディオ出力デバイスにデータ ブロックを送信するための waveOutWrite 関数が用意されています。

WAVEHDR 構造体を使用して、waveOutWrite を使用して送信する波形オーディオ データ ブロックを指定します。 この構造体には、ロックされたデータ ブロックへのポインター、データ ブロックの長さ、およびいくつかのフラグが含まれています。 このデータ ブロックは、使用する前に準備する必要があります。データ ブロックの準備については、「 オーディオ データ ブロック」を参照してください。

waveOutWrite を使用して出力デバイスにデータ ブロックを送信した後、デバイス ドライバーがデータ ブロックで終了するまで待ってから解放する必要があります。 複数のデータ ブロックを送信する場合は、データ ブロックの完了を監視して、追加のブロックを送信するタイミングを把握する必要があります。 データ ブロックの詳細については、「 オーディオ データ ブロック」を参照してください。

PCM Waveform-Audio データ形式

WAVEHDR 構造体の lpData メンバーは、波形オーディオ データ サンプルにポイントセットします。 8 ビット PCM データの場合、各サンプルは 1 つの符号なしデータ バイトで表されます。 16 ビット PCM データの場合、各サンプルは 16 ビット符号付き値で表されます。 次の表は、PCM 波形オーディオ データの最大値、最小値、および中間値をまとめたものです。

データ形式 最大値 最小値 中間値
8 ビット PCM 255 (0xFF) 0 128 (0x80)
16 ビット PCM 32,767 (0x7FFF) –32,768 (0x8000) 0

 

PCM データパッキング

データ バイトの順序は、8 ビット形式と 16 ビット形式、およびモノラル形式とステレオ形式の間で異なります。 次の一覧では、さまざまな PCM 波形オーディオ データ形式のデータ パッキングについて説明します。

PCM 波形オーディオ形式 説明
8 ビット mono 各サンプルは、1 つのオーディオ チャネルに対応する 1 バイトです。 サンプル 1 の後にサンプル 2、3、4 などが続きます。
8 ビット ステレオ 各サンプルは 2 バイトです。 サンプル 1 の後にサンプル 2、3、4 などが続きます。 サンプルごとに、最初のバイトはチャネル 0 (左側のチャネル) で、2 番目のバイトはチャネル 1 (右側のチャネル) です。
16 ビット mono 各サンプルは 2 バイトです。 サンプル 1 の後にサンプル 2、3、4 などが続きます。 各サンプルについて、最初のバイトはチャネル 0 の下位バイト、2 番目のバイトはチャネル 0 の上位バイトです。
16 ビット ステレオ 各サンプルは 4 バイトです。 サンプル 1 の後にサンプル 2、3、4 などが続きます。 サンプルごとに、最初のバイトはチャネル 0 (左チャネル) の下位バイトです。2 番目のバイトはチャネル 0 の上位バイトです。3 番目のバイトは、チャネル 1 (右チャネル) の下位バイトです。4 番目のバイトはチャネル 1 の上位バイトです。
その他 各サンプルは、4 バイトの倍数であるブロックに含まれていますが、サンプルはバイトアラインされていない可能性があります。 チャネルの配置はマスクによって指定されます。 詳細については、「 WAVEFORMATEXTENSIBLE」を参照してください。

 

Waveform-Audio出力デバイスの終了

波形オーディオ再生が完了したら、 waveOutClose を呼び出して出力デバイスを閉じます。 波形オーディオ ファイルの再生中に waveOutClose が呼び出された場合、閉じる操作は失敗し、デバイスが閉じていないことを示すエラー コードが返されます。 デバイスを閉じる前に再生が終了するまで待機しない場合は、終了する前に waveOutReset 関数を呼び出します。 これにより、再生が終了し、デバイスを閉じることができます。 デバイスを閉じる前に、waveOutUnprepareHeader 関数を使用して、すべてのデータ ブロックの準備をクリーンしてください。