DirectSound 提供四大查詢介面,讓應用程式掌握緩衝區運行狀態與配置資訊。
GetCaps)DSCBCAPS caps = { sizeof(DSCBCAPS) };
pDSCBuffer->GetCaps(&caps);
// caps.dwBufferBytes: 緩衝區總大小
// caps.dwReserved: 保留
GetFormat)WAVEFORMATEX wfx = {};
DWORD dwWritten;
pDSCBuffer->GetFormat(&wfx, sizeof(wfx), &dwWritten);
// 注意:若 pwfxFormat 為 NULL 呼叫,dwWritten 返回所需結構大小
// 某些驅動可能返回擴充格式資訊 (cbSize > 0)
GetStatus)DWORD dwStatus;
pDSCBuffer->GetStatus(&dwStatus);
// 旗標組合:
// DSBSTATUS_CAPTURING - 正在捕捉
// DSBSTATUS_LOOPING - 循環模式
// DSBSTATUS_LOCHARDWARE - 硬體緩衝區
// DSBSTATUS_LOCSOFTWARE - 軟體緩衝區
// DSBSTATUS_TERMINATED - 已停止 (捕捉緩衝區專用)
GetCurrentPosition)DWORD dwCapturePos, dwReadPos;
pDSCBuffer->GetCurrentPosition(&dwCapturePos, &dwReadPos);
// dwCapturePos: 硬體正在寫入的位置 (捕捉游標)
// dwReadPos: 已完整寫入、可安全讀取的位置 (讀取游標)
// 應用程式只能讀取 dwReadPos 之前的資料
緩衝區循環:[==========|==========|==========]
↑ ↑
CapturePos ReadPos
(硬體寫入) (安全讀取上限)
GetCaps:配置對應大小的處理緩衝區GetFormat:確認實際協商格式 (採樣率、位深、聲道)GetStatus:監控捕捉是否正常運行、是否意外停止GetCurrentPosition:計算可讀取資料量、配合通知機制處理第五篇:資訊查詢 ← 當前 | 第六篇:通知機制 | 第七篇:特效