IAudioClient::Initialize メソッド (audioclient.h)

Initialize メソッドは、オーディオ ストリームを初期化します。

構文

HRESULT Initialize(
  [in] AUDCLNT_SHAREMODE  ShareMode,
  [in] DWORD              StreamFlags,
  [in] REFERENCE_TIME     hnsBufferDuration,
  [in] REFERENCE_TIME     hnsPeriodicity,
  [in] const WAVEFORMATEX *pFormat,
  [in] LPCGUID            AudioSessionGuid
);

パラメーター

[in] ShareMode

接続の共有モード。 このパラメーターを使用して、クライアントは、オーディオ エンドポイント デバイスを他のクライアントと共有するかどうかをオーディオ エンジンに通知します。 クライアントは、このパラメーターを次の AUDCLNT_SHAREMODE 列挙値のいずれかに設定する必要があります。

AUDCLNT_SHAREMODE_EXCLUSIVE

AUDCLNT_SHAREMODE_SHARED

[in] StreamFlags

ストリームの作成を制御するためのフラグ。 クライアントは、このパラメーターを 0 または 1 つ以上の AUDCLNT_STREAMFLAGS_XXX定数またはAUDCLNT_SESSIONFLAGS_XXX定数 のビットごとの OR に設定する必要があります。

[in] hnsBufferDuration

時間値としてのバッファー容量。 このパラメーターは REFERENCE_TIME 型であり、100 ナノ秒単位で表されます。 このパラメーターには、オーディオ アプリケーションがオーディオ エンジン (共有モード) またはエンドポイント デバイス (排他モード) と共有するバッファーに対して呼び出し元が要求するバッファー サイズが含まれます。 呼び出しが成功した場合、 メソッドは、この大きさが最も大きいバッファーを割り当てます。 REFERENCE_TIMEの詳細については、Windows SDK のドキュメントを参照してください。 バッファーの要件の詳細については、「備考」を参照してください。

[in] hnsPeriodicity

デバイス期間。 このパラメーターは、排他モードでのみ 0 以外にすることができます。 共有モードでは、常にこのパラメーターを 0 に設定します。 排他モードでは、このパラメーターは、オーディオ エンドポイント デバイスによる連続するバッファー アクセスに対して要求されたスケジュール期間を指定します。 要求されたデバイス期間が、デバイスの最小期間とシステムの最大期間によって設定された範囲外にある場合、メソッドは期間をその範囲にクランプします。 このパラメーターが 0 の場合、メソッドはデバイス期間を既定値に設定します。 既定のデバイス期間を取得するには、 IAudioClient::GetDevicePeriod メソッドを 呼び出します。 AUDCLNT_STREAMFLAGS_EVENTCALLBACK ストリーム フラグが設定され、AUDCLNT_SHAREMODE_EXCLUSIVEが ShareMode として設定されている場合、 hnsPeriodicity は 0 以外で hnsBufferDuration と等しい必要があります。

[in] pFormat

書式記述子へのポインター。 このパラメーターは、 WAVEFORMATEX 型 (または WAVEFORMATEXTENSIBLE) の有効なフォーマット記述子を指している必要があります。 詳細については、「解説」を参照してください。

[in] AudioSessionGuid

セッション GUID へのポインター。 このパラメーターは、ストリームが属するオーディオ セッションを識別する GUID 値を指します。 GUID が以前に開かれたセッションを識別する場合、 メソッドはそのセッションにストリームを追加します。 GUID で既存のセッションが識別されない場合、 メソッドは新しいセッションを開き、そのセッションにストリームを追加します。 ストリームは、その有効期間中、同じセッションのメンバーのままです。 このパラメーターを NULL に設定することは、GUID_NULL値へのポインターを渡すことと同じです。

戻り値

メソッドが成功した場合は、S_OK を返します。 エラーが発生した場合、次の表に示す値が、可能なリターン コードに含まれますが、これらに限定されません。

リターン コード 説明
AUDCLNT_E_ALREADY_INITIALIZED
IAudioClient オブジェクトは既に初期化されています。
AUDCLNT_E_WRONG_ENDPOINT_TYPE
AUDCLNT_STREAMFLAGS_LOOPBACK フラグが設定されていますが、エンドポイント デバイスはキャプチャ デバイスであり、レンダリング デバイスではありません。
AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED
メモ Windows 7 以降に適用されます。
 
要求されたバッファー サイズが揃っていない。 このコードは、呼び出し元がAUDCLNT_SHAREMODE_EXCLUSIVEとAUDCLNT_STREAMFLAGS_EVENTCALLBACK フラグを指定した場合に、レンダリングまたはキャプチャ デバイスに対して返すことができます。 呼び出し元は、配置されたバッファー サイズで Initialize をもう一度呼び出す必要があります。 詳細については、「解説」を参照してください。
AUDCLNT_E_BUFFER_SIZE_ERROR
メモ Windows 7 以降に適用されます。
 
排他モード クライアントによって要求されたバッファー期間の値が範囲外であることを示します。 プル モードの要求された期間の値は、5,000 ミリ秒を超えてはなりません。プッシュ モードの場合、期間の値は 2 秒を超えてはなりません。
AUDCLNT_E_CPUUSAGE_EXCEEDED
プロセス パスの期間が最大 CPU 使用率を超えたことを示します。 オーディオ エンジンは、プロセス パス期間が最大 CPU 使用率を超える回数を維持することで、CPU 使用率を追跡します。 CPU 使用率の最大値は、エンジンの周期性の割合として計算されます。 パーセンテージ値は、システムの CPU スロットル値 (10% と 90% の範囲内) です。 この値が見つからない場合は、既定値の 40% を使用して最大 CPU 使用率が計算されます。
AUDCLNT_E_DEVICE_INVALIDATED
オーディオ エンドポイント デバイスが取り外されているか、オーディオ ハードウェアまたは関連するハードウェア リソースが再構成、無効、削除、またはその他の方法で使用できなくなります。
AUDCLNT_E_DEVICE_IN_USE
エンドポイント デバイスは既に使用されています。 デバイスが排他モードで使用されているか、デバイスが共有モードで使用されており、呼び出し元が排他モードでデバイスを使用するように求められます。
AUDCLNT_E_ENDPOINT_CREATE_FAILED
メソッドは、レンダーまたはキャプチャ デバイスのオーディオ エンドポイントを作成できませんでした。 これは、オーディオ エンドポイント デバイスが取り外されているか、オーディオ ハードウェアまたは関連するハードウェア リソースが再構成、無効、削除、またはその他の方法で使用できなくなった場合に発生する可能性があります。
AUDCLNT_E_INVALID_DEVICE_PERIOD
メモ Windows 7 以降に適用されます。
 
排他モード クライアントによって要求されたデバイス期間が 5,000 ミリ秒を超えることを示します。
AUDCLNT_E_UNSUPPORTED_FORMAT
オーディオ エンジン (共有モード) またはオーディオ エンドポイント デバイス (排他モード) は、指定された形式をサポートしていません。
AUDCLNT_E_EXCLUSIVE_MODE_NOT_ALLOWED
呼び出し元はエンドポイント デバイスの排他モードの使用を要求していますが、ユーザーはデバイスの排他モード使用を無効にしています。
AUDCLNT_E_BUFDURATION_PERIOD_NOT_EQUAL
AUDCLNT_STREAMFLAGS_EVENTCALLBACK フラグは設定されますが、パラメーター hnsBufferDurationhnsPeriodicity は等しくありません。
AUDCLNT_E_SERVICE_NOT_RUNNING
Windows オーディオ サービスが実行されていません。
E_POINTER
パラメーター pFormatNULL です
E_INVALIDARG
パラメーター pFormat は無効な書式の説明を指します。または、AUDCLNT_STREAMFLAGS_LOOPBACK フラグが設定されているが 、ShareMode がAUDCLNT_SHAREMODE_SHAREDと等しくない。または、AUDCLNT_STREAMFLAGS_CROSSPROCESS フラグが設定されているが 、ShareMode がAUDCLNT_SHAREMODE_EXCLUSIVEと等しい。

SetClientProperties の以前の呼び出しが、オーディオ/レンダリング ストリームの無効なカテゴリで行われました。

E_OUTOFMEMORY
メモリが不足しています。

解説

オーディオ エンドポイント デバイスで IAudioClient インターフェイスをアクティブ化した後、クライアントは Initialize を正常に呼び出し、クライアントとデバイスの間でオーディオ ストリームを初期化するには、 Initialize を 1 回だけ正常に呼び出す必要があります。 クライアントは、オーディオ ハードウェアに直接接続するか (排他モード)、またはオーディオ エンジン (共有モード) を介して間接的に接続できます。 Initialize 呼び出しでは、クライアントはストリームのオーディオ データ形式、バッファー サイズ、およびオーディオ セッションを指定します。

メモ Windows 8 では、オーディオ デバイスにアクセスするための IAudioClient の最初の使用は STA スレッド上にある必要があります。 MTA スレッドからの呼び出しにより、未定義の動作が発生する可能性があります。
 
共有モード ストリームの作成は、オーディオ デバイスが既に共有モードで動作しているか、デバイスが現在使用されていない場合にのみ成功します。 デバイスが排他モードで既に動作している場合、共有モード ストリームの作成が失敗します。

ストリームがイベント ドリブンとして初期化され、共有モードの場合、 ShareMode は AUDCLNT_SHAREMODE_SHARED に設定され、設定されているストリーム フラグの 1 つにAUDCLNT_STREAMFLAGS_EVENTCALLBACKが含まれます。 このようなストリームの場合、関連付けられているアプリケーションは 、IAudioClient::SetEventHandle を呼び出してハンドルを取得する必要もあります。 ストリームを廃止するとき、オーディオ エンジンは ハンドルを使用してストリーム オブジェクトを解放できます。 ストリーム オブジェクトを解放する前に IAudioClient::SetEventHandle を呼び出すと、オーディオ エンジンが使用可能なハンドルを待機している間に、数秒 (タイムアウト期間) の遅延が発生する可能性があります。 タイムアウト期間が経過すると、オーディオ エンジンはストリーム オブジェクトを解放します。

排他モード ストリームの作成が成功するかどうかは、デバイスの可用性や、デバイスの排他モード操作を制御するユーザー制御設定など、いくつかの要因によって異なります。 詳細については、「 排他モード ストリーム」を参照してください。

IAudioClient オブジェクトは、オーディオ エンジンまたはオーディオ ハードウェアへの接続を 1 つだけサポートします。 この接続は、 IAudioClient オブジェクトの有効期間にわたって続きます。

クライアントは、Initialize を呼び出したにのみ、次のメソッドを呼び出す必要があります。

次のメソッドでは、最初に Initialize を呼び出す必要はありません。 これらのメソッドは、 IAudioClient インターフェイスをアクティブ化した後、いつでも呼び出すことができます。

共有モードまたは排他モード接続を設定するために Initialize を呼び出す前に、クライアント は IAudioClient::IsFormatSupported メソッドを呼び出して、オーディオ エンジンまたはオーディオ エンドポイント デバイスがそのモードで特定の形式をサポートしているかどうかを検出できます。 共有モード接続を開く前に、クライアントは IAudioClient::GetMixFormat メソッドを呼び出すことによってオーディオ エンジンのミックス形式を取得できます。

クライアントとオーディオ エンジンの間で共有されるエンドポイント バッファーは、クライアントとオーディオ エンジンによる処理パス間のオーディオ ストリームでグリッチが発生するのを防ぐのに十分な大きさである必要があります。 レンダリング エンドポイントの場合、クライアント スレッドは定期的にバッファーにデータを書き込み、オーディオ エンジン スレッドは定期的にバッファーからデータを読み取ります。 キャプチャ エンドポイントの場合、エンジン スレッドはバッファーに定期的に書き込み、クライアント スレッドはバッファーから定期的に読み取ります。 どちらの場合も、クライアント スレッドとエンジン スレッドの期間が等しくない場合、バッファーは、グリッチが発生することなく、2 つの期間の長さに対応するのに十分な大きさである必要があります。

クライアントは、 hnsBufferDuration パラメーターを使用してバッファー サイズを指定します。 クライアントは、バッファーに対して実行される定期的な処理パス間でグリッチが発生しないように十分な大きさのバッファーを要求する必要があります。 同様に、 Initialize メソッドは、エンジン スレッドがバッファーに対して実行する定期的な処理パス間でグリッチが発生しないようにするために必要な最小バッファー サイズよりもバッファーが小さくなりないようにします。 クライアントがオーディオ エンジンの最小必要バッファー サイズよりも小さいバッファー サイズを要求する場合、メソッドは、クライアントが要求したバッファー サイズではなく、この最小バッファー サイズにバッファー サイズを設定します。

クライアントがオーディオ フレームの整数ではないバッファー サイズ ( hnsBufferDuration パラメーターを使用) を要求した場合、メソッドは要求されたバッファー サイズを次の整数フレーム数に切り上げます。

Initialize 呼び出しの後、クライアントは IAudioClient::GetBufferSize メソッドを呼び出して、エンドポイント バッファーの正確なサイズを取得する必要があります。 各処理パスの間に、クライアントは、バッファーとの間で転送するデータの量を計算するために、実際のバッファー サイズが必要になります。 クライアントは IAudioClient::GetCurrentPadding メソッドを 呼び出して、バッファー内のデータの現在の処理に使用できるデータの量を決定します。

クライアント アプリケーションとオーディオ エンドポイント デバイスの間の最小ストリーム待機時間を実現するには、クライアント スレッドをオーディオ エンジン スレッドと同じ期間に実行する必要があります。 エンジン スレッドの期間は固定されており、クライアントによって制御することはできません。 クライアントの期間をエンジンの期間よりも小さくすると、待機時間を短縮したりバッファー サイズを小さくしたりすることなく、プロセッサに対するクライアント スレッドの負荷が不必要に増加します。 エンジン スレッドの期間を決定するために、クライアントは IAudioClient::GetDevicePeriod メソッドを 呼び出すことができます。 バッファーをエンジン スレッドに必要な最小サイズに設定するには、クライアントは、hnsBufferDuration パラメーターを 0 に設定して Initialize を呼び出す必要があります。 Initialize 呼び出しの後、クライアントは IAudioClient::GetBufferSize を呼び出すことによって、結果のバッファーのサイズを取得できます。

クライアントには、タイミング グリッチをまれまたは存在しないものにするために厳密に必要なサイズよりも大きいバッファー サイズを要求するオプションがあります。 バッファー サイズを大きくしても、ストリームの待機時間が増加するとは限りません。 レンダリング ストリームの場合、バッファー経由の待機時間は、クライアントの書き込みポインターとエンジンの読み取りポインターの分離によってのみ決定されます。 キャプチャ ストリームの場合、バッファー経由の待機時間は、エンジンの書き込みポインターとクライアントの読み取りポインターの分離によってのみ決定されます。

ループバック フラグ (AUDCLNT_STREAMFLAGS_LOOPBACK) により、オーディオ ループバックが有効になります。 クライアントは、共有モード ストリームを使用するレンダリング エンドポイントでのみオーディオ ループバックを有効にすることができます。 オーディオ ループバックは、主に音響エコー キャンセル (AEC) をサポートするために提供されます。

AEC クライアントには、レンダリング エンドポイントと、オーディオ エンジンから出力ストリームをキャプチャする機能の両方が必要です。 エンジンの出力ストリームは、オーディオ デバイスがスピーカーを介して再生するグローバル ミックスです。 オーディオ ループバックが有効になっている場合、クライアントは IAudioClient::GetService メソッドを呼び出してレンダリング ストリーム オブジェクトの IAudioCaptureClient インターフェイスを取得することで、グローバル オーディオ ミックスのキャプチャ バッファーを開くことができます。 オーディオ ループバックが有効になっていない場合、レンダリング ストリームでキャプチャ バッファーを開こうとすると失敗します。 キャプチャ バッファー内のループバック データはデバイス形式であり、クライアントはデバイスの PKEY_AudioEngine_DeviceFormat プロパティに対してクエリを実行して取得できます。

Windows 10より前のバージョンの Windows では、ストリームがイベント ドリブン バッファリング (AUDCLNT_STREAMFLAGS_EVENTCALLBACK) で初期化され、ループバックが有効 (AUDCLNT_STREAMFLAGS_LOOPBACK) の場合、プルモード キャプチャ クライアントはイベントを受信しません。 この構成でストリームを開くと、 Initialize 呼び出しは成功しますが、バッファーが処理の準備が整うたびにキャプチャ クライアントに通知するために関連するイベントは発生しません。 これを回避するには、イベント ドリブン モードでレンダリング ストリームを初期化します。 クライアントは、レンダー ストリームのイベントを受信するたびに、キャプチャ エンドポイント バッファーから次のサンプル セットを読み取るキャプチャ スレッドを実行するようにキャプチャ クライアントに通知する必要があります。 Windows 10時点で、関連するイベント ハンドルは、アクティブなループバックが有効なストリームに対して設定されるようになりました。

排他モード ストリームはループバック モードで動作できないため、すべてのストリームを共有モードで開く必要があることに注意してください。 オーディオ ループバックの詳細については、「 ループバック録音」を参照してください。

AUDCLNT_STREAMFLAGS_EVENTCALLBACK フラグは、クライアントによるオーディオ バッファーの処理がイベント ドリブンであることを示します。 WASAPI では、共有モードストリームと排他モード ストリームの両方の待機時間の短い処理を可能にするイベント ドリブン バッファリングがサポートされています。

Windows Vista の最初のリリースでは、ストリームのレンダリングに対してのみ、イベント ドリブン バッファリング (つまり、AUDCLNT_STREAMFLAGS_EVENTCALLBACK フラグの使用) がサポートされています。

Windows Vista の初期リリースでは、キャプチャ ストリームの場合、AUDCLNT_STREAMFLAGS_EVENTCALLBACK フラグは共有モードでのみサポートされています。 このフラグを設定しても、排他モードキャプチャ ストリームには影響しません。 つまり、アプリケーションは Initialize 呼び出しを使用して排他モードでこのフラグを指定しますが、アプリケーションは通常オーディオ ストリームのキャプチャに必要なイベントを受信しません。 Windows Vista Service Pack 1 リリースでは、このフラグは共有モードと排他モードで機能します。アプリケーションでは、このフラグを設定して、キャプチャ ストリームのイベント バッファリングを有効にすることができます。 オーディオ ストリームのキャプチャの詳細については、「ストリームの キャプチャ」を参照してください。

イベント ドリブン バッファリングを有効にするには、クライアントがシステムにイベント ハンドルを提供する必要があります。 Initialize 呼び出しの後、IAudioClient::Start メソッドを呼び出してストリームを開始する前に、クライアントは IAudioClient::SetEventHandle メソッドを呼び出してイベント ハンドルを設定する必要があります。 ストリームの実行中、システムは定期的にイベントを通知して、オーディオ データが処理可能であることをクライアントに示します。 処理パスの間に、クライアント スレッドは WaitForSingleObject などの同期関数を呼び出すことによってイベント ハンドルを待機します。 同期関数の詳細については、Windows SDK のドキュメントを参照してください。

イベント ドリブン バッファリングを使用する共有モード ストリームの場合、呼び出し元は hnsPeriodicityhnsBufferDuration の両方を 0 に設定する必要があります。 Initialize メソッドは、オーディオ エンジンのスケジュール期間に基づいて、割り当てるバッファーの大きさを決定します。 クライアントのバッファー処理スレッドはイベント ドリブンですが、前述のように、基本的なバッファー管理プロセスは変更されません。 スレッドが起動するたびに、 IAudioClient::GetCurrentPadding を呼び出して、レンダリング バッファーに書き込むか、キャプチャ バッファーから読み取るデータの量を決定する必要があります。 Initialize メソッドがイベント ドリブン バッファリングを使用する排他モード ストリームに割り当てる 2 つのバッファーとは対照的に、共有モード ストリームには 1 つのバッファーが必要です。

イベント ドリブン バッファリングを使用する排他モード ストリームの場合、呼び出し元は hnsPeriodicityhnsBufferDuration に 0 以外の値を指定する必要があり、これら 2 つのパラメーターの値は等しい必要があります。 Initialize メソッドは、ストリームに 2 つのバッファーを割り当てます。 各バッファーの期間は 、hnsBufferDuration パラメーターの値と等しくなります。 レンダリング ストリームの Initialize 呼び出しの後、呼び出し元はストリームを開始する前に、2 つのバッファーの最初のバッファーを入力する必要があります。 キャプチャ ストリームの場合、バッファーは最初は空であり、呼び出し元は、そのバッファーのイベントが通知されるまで、各バッファーが空のままであると想定する必要があります。 ストリームの実行中、システムは 1 つのバッファーまたはもう 1 つのバッファーをクライアントに交互に送信します。この形式のダブル バッファリングは"ping-ponging" と呼ばれます。 クライアントがシステムからバッファーを受信するたびに (システムはイベントを通知して示します)、クライアントはバッファー全体を処理する必要があります。 たとえば、クライアントがバッファー サイズと一致しない IAudioRenderClient::GetBuffer メソッドにパケット サイズを要求した場合、メソッドは失敗します。 パケット サイズは常にバッファー サイズと等しい必要があるため、 IAudioClient::GetCurrentPadding メソッドの呼び出しは不要です。 前に説明したバッファリング モードとは対照的に、イベント ドリブンの排他モード ストリームの待機時間は、バッファー サイズに直接依存します。

オーディオ セッションで説明されているように、レンダリング ストリームを含むセッションの既定の動作は、そのボリュームとミュート設定がアプリケーションの再起動間で保持されるということです。 AUDCLNT_STREAMFLAGS_NOPERSIST フラグは、既定の動作をオーバーライドし、設定を非永続にします。 このフラグは、キャプチャ ストリームを含むセッションには影響しません。これらのセッションの設定は永続的ではありません。 さらに、ループバック ストリーム (AUDCLNT_STREAMFLAGS_LOOPBACK フラグで初期化されたストリーム) を含むセッションの設定は永続的ではありません。

レンダリング エンドポイント デバイスに接続するセッションにのみ、永続ボリュームとミュート設定を設定できます。 セッションに追加される最初のストリームによって、セッションの設定が永続的かどうかが決まります。 したがって、最初のストリームの初期化中にAUDCLNT_STREAMFLAGS_NOPERSISTまたはAUDCLNT_STREAMFLAGS_LOOPBACK フラグが設定されている場合、セッションの設定は永続的ではありません。 それ以外の場合は永続的です。 その永続化は、セッション オブジェクトの有効期間中に追加または削除される可能性がある追加のストリームの影響を受けません。

Initialize の呼び出しによって IAudioClient インターフェイス インスタンスが正常に初期化された後、同じインターフェイス インスタンスを初期化する後続の Initialize 呼び出しは失敗し、エラー コード E_ALREADY_INITIALIZEDが返されます。

Initialize の最初の呼び出しが失敗した場合、以降の Initialize 呼び出しは失敗し、インターフェイスが初期化されていない場合でも、エラー コード E_ALREADY_INITIALIZEDが返される可能性があります。 この場合は、IAudioClient インターフェイスを解放し、再度 Initialize を呼び出す前に、MMDevice API から新しい IAudioClient インターフェイスを取得します。

Initialize メソッドを呼び出すコード例については、次のトピックを参照してください。

Windows 7 以降では、 Initialize はレンダリングまたはキャプチャ デバイスのAUDCLNT_E_BUFFER_SIZE_NOT_ALIGNEDを返すことができます。 これは、 hnsBufferDuration パラメーターで呼び出し元によって指定されたバッファー サイズがアラインされていないことを示します。 このエラー コードは、呼び出し元が排他モード ストリーム (AUDCLNT_SHAREMODE_EXCLUSIVE) とイベント ドリブン バッファリング (AUDCLNT_STREAMFLAGS_EVENTCALLBACK) を要求した場合にのみ返されます。

Initialize がAUDCLNT_E_BUFFER_SIZE_NOT_ALIGNEDを返す場合、呼び出し元は Initialize を再度呼び出し、アラインされたバッファー サイズを指定する必要があります。 次の手順に従います。

  1. IAudioClient::GetBufferSize を呼び出し、次に整列されたバッファー サイズ (フレーム単位) を受け取ります。
  2. IAudioClient::Release を呼び出して、AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNEDを返した前の呼び出しで使用したオーディオ クライアントを解放します。
  3. アラインされたバッファー サイズを 100 ナノ秒単位 (hns) で計算します。 バッファー サイズは です (REFERENCE_TIME)((10000.0 * 1000 / WAVEFORMATEX.nSamplesPerSecond * nFrames) + 0.5)。 この数式では、 nFramesGetBufferSize によって取得されるバッファー サイズです。
  4. パラメーター iid を REFIID IID_IAudioClientに設定して IMMDevice::Activate メソッドを呼び出して、新しいオーディオ クライアントを作成します。
  5. 作成したオーディオ クライアントで Initialize をもう一度呼び出し、新しいバッファー サイズと周期性を指定します。

Windows 10以降、ハードウェア オフロードオーディオ ストリームはイベント ドリブンである必要があります。 つまり、IAudioClient2::SetClientProperties を呼び出し、AudioClientPropertiesbIsOffload パラメーターを TRUE に設定する場合は、StreamFlags パラメーターで AUDCLNT_STREAMFLAGS_EVENTCALLBACK フラグを IAudioClient::Initialize に指定する必要があります。

次のコード例は、 AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED リターン コードに応答する方法を示しています。

#define REFTIMES_PER_SEC  10000000

HRESULT CreateAudioClient(IMMDevice* pDevice, IAudioClient** ppAudioClient)
{
    if (!pDevice)
    {
        return E_INVALIDARG;
    }

    if (!ppAudioClient)
    {
        return E_POINTER;
    }

    HRESULT hr = S_OK;
    
    WAVEFORMATEX *pwfx = NULL;

    REFERENCE_TIME hnsRequestedDuration = REFTIMES_PER_SEC;

    UINT32 nFrames = 0;

    IAudioClient *pAudioClient = NULL;

    // Get the audio client.
    CHECK_HR( hr = pDevice->Activate(
        __uuidof(IAudioClient), 
        CLSCTX_ALL,
        NULL, 
        (void**)&pAudioClient));

    // Get the device format.
    CHECK_HR( hr = pAudioClient->GetMixFormat(&pwfx));

    // Open the stream and associate it with an audio session.
    hr = pAudioClient->Initialize( 
        AUDCLNT_SHAREMODE_EXCLUSIVE,
        AUDCLNT_STREAMFLAGS_EVENTCALLBACK, 
        hnsRequestedDuration, 
        hnsRequestedDuration, 
        pwfx, 
        NULL);

    // If the requested buffer size is not aligned...
    if (hr == AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED)
    {	
        // Get the next aligned frame.
        CHECK_HR( hr = pAudioClient->GetBufferSize(&nFrames));
        
        hnsRequestedDuration = (REFERENCE_TIME)
        ((10000.0 * 1000 / pwfx->nSamplesPerSec * nFrames) + 0.5);

        // Release the previous allocations.
        SAFE_RELEASE(pAudioClient);
        CoTaskMemFree(pwfx);
        
        // Create a new audio client.
        CHECK_HR( hr = pDevice->Activate(
            __uuidof(IAudioClient), 
            CLSCTX_ALL,
            NULL, 
            (void**)&pAudioClient));
    
        // Get the device format.
        CHECK_HR( hr = pAudioClient->GetMixFormat(&pwfx));
        
        // Open the stream and associate it with an audio session.
        CHECK_HR( hr = pAudioClient->Initialize( 
            AUDCLNT_SHAREMODE_EXCLUSIVE,
            AUDCLNT_STREAMFLAGS_EVENTCALLBACK, 
            hnsRequestedDuration, 
            hnsRequestedDuration, 
            pwfx, 
            NULL));
    }
    else
    {
        CHECK_HR (hr);
    }
    
    // Return to the caller.
    *(ppAudioClient) = pAudioClient;
    (*ppAudioClient)->AddRef();

done:

    // Clean up.
    CoTaskMemFree(pwfx);
    SAFE_RELEASE(pAudioClient);
    return hr;
}

必要条件

   
対象プラットフォーム Windows
ヘッダー audioclient.h

関連項目

IAudioCaptureClient インターフェイス

IAudioClient インターフェイス

IAudioClient::GetBufferSize

IAudioClient::GetCurrentPadding

IAudioClient::GetDevicePeriod

IAudioClient::GetMixFormat

IAudioClient::GetService

IAudioClient::SetEventHandle

IAudioClient::Start

IAudioRenderClient::GetBuffer