0

ゲームのオーディオ エンジンと、呼び出される Microsoft Core Audio API との間の相互作用を研究しています。ゲームがデフォルトのエンドポイントから「WAVEFORMATEX」情報を取得した方法を理解しようとしています。ゲーム開始時のある時点で、 IsFormatSupported() [ https://msdn.microsoft.com/en-us/library/windows/desktop/dd370876(v=vs.85).aspx]が * で呼び出されることがわかりますpFormat (IsFormatSupported の 2 番目のパラメーター) には、既定のエンドポイントの形式情報 (つまり、チャネル、ビット/サンプル、サンプリング レートなど) が入力されます。これより前に、ゲームが GetMixFormat() [ https://msdn.microsoft.com/en-us/library/windows/desktop/dd370872(v=vs.85).aspx]を呼び出していないこともわかります。

ただし、IMMDeviceEnumerator (EnumAudioEndpoints、QuryInterface、AddRef など)、IMMDeviceCollection (GetCount、Item)、および IMMDevice (QueryInterface、AddRef など) に関連する一連の呼び出しがあります。これらのドキュメントを見ると、「フォーマット」(WAVEFORMATEX) 情報を直接取得する方法はないようです。MMDevice::OpenPropertyStore() が呼び出され、続いて 'GetId()' が呼び出されますが、'PKEY_AudioEngine_DeviceFormat' パラメーターを使用した 'GetValue()' の呼び出しが見られません。これにより、'format' 情報が提供される可能性があります。したがって、ゲームが「フォーマット」情報をどのように取得したかについては、少し困惑しています。前述の呼び出しのいずれかで、間接的に「フォーマット」情報を取得できますか?

「オーディオとビデオ」フィルターを有効にして分析するために、API モニター アプリケーション [ http://www.rohitab.com/downloads]を使用しています。

4

1 に答える 1

0

実際には からミキサー形式を取得することができますIsFormatSupported

HRESULT IsFormatSupported(
  [in]        AUDCLNT_SHAREMODE ShareMode,
  [in]  const WAVEFORMATEX      *pFormat,
  [out]       WAVEFORMATEX      **ppClosestMatch //< Audio format suggested by the Windows audio engine
);

IsFormatSupportedはフォーマット ネゴシエーションに使用されます。Windows では、オーディオ グラフに変換可能なオーディオ処理オブジェクトがあれば、ミキサー フォーマットとは異なるオーディオ フォーマットを開くことができます。ただしpFormat、ミキサー形式ではない を提供し、使用可能な変換がない場合、Windows は、ミキサー形式が取り込まれppClosestMatchた割り当てWAVEFORMATEX済みの を割り当てます。ミキサー形式を取得できるテスト済みのサンプル コードを次に示しますIsFormatSupported(簡単にするためにエラー処理はありません)。

CComPtr<IMMDeviceEnumerator> pEnum;
pEnum.CoCreateInstance(__uuidof(MMDeviceEnumerator));
CComPtr<IMMDevice> pDevice;
pEnum->GetDefaultAudioEndpoint(eRender, eMultimedia,&pDevice);
CComPtr<IAudioClient> pAudioClient;
pDevice->Activate( __uuidof(IAudioClient), CLSCTX_ALL, NULL, (void**)&pAudioClient);
// Provide an empty weveformatex
WAVEFORMATEX wfxEmpty = {};
WAVEFORMATEX *pClosestWfx;
HRESULT hr = pAudioClient->IsFormatSupported(AUDCLNT_SHAREMODE_SHARED, &wfxEmpty, &pClosestWfx);
if (hr == S_FALSE) {
    // The audio engine suggest us a format in pClosestWfx
    // which is the mixer format because we did not provide a valid input format.
    // the current application did not use any windows API to get the mixer format directly
    // ...
    CoTaskMemFree(pClosestWfx);
}

これは、ミキサー形式を取得する別の方法です。

于 2016-04-24T09:25:53.753 に答える