[英]WASAPI: Play sine wave sound in minimum latency without glitches (exclusive-event driven mode)
[英]WASAPI: Choosing a wave format for exclusive output
我正在嘗試使用WASAPI打開帶有輸出設備的獨占流。 我在選擇可接受的格式時遇到問題,因為似乎沒有關於給定設備接受哪種格式的提示。
在我的例子中, IAudioClient::GetMixFormat()
,否則將返回一種設備的默認格式,返回一種不能在獨占模式下使用的格式( IAudioClient::IsFormatSupported()
返回AUDCLNT_E_UNSUPPORTED_FORMAT
)。 我不知道從哪里去。 有一些荒謬的波形參數組合 - 我真的必須迭代它們中的每一個直到有效嗎?
好吧,我問了MSDN論壇,他們想出了一個很好的答案。
您需要通過IMMDevice::OpenPropertyStore()
檢查設備的默認設備格式,然后檢查IPropertyStore::GetValue()
,而不是IAudioClient::GetMixFormat()
。 以下是檢索可接受的WAVEFORMATEX結構的代碼:
//CoInitialize/Enumerate devices
IPropertyStore* store = nullptr;
hr = device->OpenPropertyStore(STGM_READ, &store);
if (FAILED(hr)) {
ExitProcess(1);
}
PROPVARIANT prop;
hr = store->GetValue(PKEY_AudioEngine_DeviceFormat, &prop);
if (FAILED(hr)) {
ExitProcess(2);
}
hr = device->Activate (
__uuidof(IAudioClient),
CLSCTX_ALL,
NULL,
(void**)&audioClient
);
device->Release();
device = nullptr;
if (FAILED(hr)) {
ExitProcess(3);
}
hr = audioClient->IsFormatSupported (
AUDCLNT_SHAREMODE_EXCLUSIVE,
(PWAVEFORMATEX)prop.blob.pBlobData,
NULL
);
if (FAILED(hr)) {
ExitProcess(4);
}
hr的最終值是S_OK。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.