首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

DirectSound 波形捕捉系列(六):捕捉緩衝區通知機制

     編輯:關於C++

使用 IDirectSoundNotify8 實作高效緩衝區位置通知

輪詢 GetCurrentPosition 效率低且延遲高。DirectSound 提供事件通知機制:在緩衝區預設位置設定通知點,讀取游標到達時觸發事件,實現即時資料處理。

通知設定流程

  1. 取得 IDirectSoundNotify8 介面
    LPDIRECTSOUNDNOTIFY8 pNotify;
    pDSCBuffer->QueryInterface(IID_IDirectSoundNotify8, (void**)&pNotify);
  2. 為每個通知點建立事件物件
    HANDLE hEvents[3];
    for (int i = 0; i < 3; ++i)
        hEvents[i] = CreateEvent(NULL, TRUE, FALSE, NULL);  // 手動重置、非訊號初始
  3. 填寫 DSBPOSITIONNOTIFY 陣列
    DSBPOSITIONNOTIFY notifies[3];
    notifies[0].dwOffset = buffer_size / 2 - 1;   // 中點
    notifies[0].hEventNotify = hEvents[0];
    notifies[1].dwOffset = buffer_size - 1;       // 末端
    notifies[1].hEventNotify = hEvents[1];
    notifies[2].dwOffset = DSBPN_OFFSETSTOP;      // 停止捕捉
    notifies[2].hEventNotify = hEvents[2];
  4. 註冊通知位置
    pNotify->SetNotificationPositions(3, notifies);
    pNotify->Release();

關鍵限制

  • 不可在緩衝區運行中設定通知,必須在 Start() 前完成
  • 通知位置以位元組偏移量指定,範圍 0 ~ 緩衝區大小-1
  • DSBPN_OFFSETSTOP 特殊值:捕捉停止時觸發

處理迴圈範例

while (capturing) {
    DWORD idx = WaitForMultipleObjects(3, hEvents, FALSE, INFINITE) - WAIT_OBJECT_0;
    if (idx == 0) {  // 中點通知
        ProcessHalfBuffer();
        ResetEvent(hEvents[0]);
    }
    else if (idx == 1) {  // 末端通知
        ProcessEndBuffer();
        ResetEvent(hEvents[1]);
    }
    else if (idx == 2) {  // 停止通知
        capturing = false;
    }
}

優勢對比

方式CPU 佔用延遲複雜度
輪詢 GetCurrentPosition高 (忙碌等待)不定 (視輪詢間隔)簡單
事件通知極低 (核心阻塞)極低 (硬體觸發)中等

完整系列導覽

第六篇:通知機制 ← 當前 | 第七篇:特效 (AEC/NS) | 第八篇:使用緩衝區

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved