程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 波形捕捉:(6)“捕捉緩沖區”通知

波形捕捉:(6)“捕捉緩沖區”通知

編輯:關於C++

想要定期的將數據從“捕捉緩沖區”復制出來,你的應用程序必 須知道什麼時候這個讀指針(讀指針的位置就是可以安全讀取數據的最高位置) 到達緩沖區中特定的位置。獲取這個信息的一個辦法是通過 IDirectSoundCaptureBuffer8::GetCurrentPosition 方法輪詢讀指針的位置。 另一種更有效的辦法是使用通知(notification)。使用 IDirectSoundNotify8::SetNotificationPositions 方法,你可以在緩沖區中設 置若干個點,在這些點上會觸發事件。你不能在緩沖區正在使用的時候設置它。

首先,你必須得到 IDirectSoundNotify8 接口。你可以通過使用緩沖區對象 的 QueryInterface 方法得到。

使用Win32 CreateEvent 方法為每一個通知的位置創建一個事件對象。將這 個事件的句柄放置在一個 DSBPOSITIONNOTIFY 結構體的 hEventNotify 成員中 。在這個結構體的 dwOffset 成員中,指定在緩沖區中你想要事件被觸發的偏移 量。如果你想要設置多個通知位置那麼就傳遞這個結構體(或結構體數組)的地 址給 SetNotificationPositions方法。

下面的例子在一秒鐘的緩沖區中設置了三個通知位置。第一個事件將在讀指 針接近緩沖區中點的時候被觸發,另一個事件將在讀指針緩沖區終點的時候被觸 發,第三個則會在捕捉停止的時候被觸發。

Code

HRESULT SetCaptureNotifications(LPDIRECTSOUNDCAPTUREBUFFER8 pDSCB)
{
 #define cEvents 3

 LPDIRECTSOUNDNOTIFY8 pDSNotify;
 WAVEFORMATEX     wfx; 
 HANDLE   rghEvent[cEvents] = {0};
 DSBPOSITIONNOTIFY rgdsbpn[cEvents];
 HRESULT  hr;

 if (NULL == pDSCB) return E_INVALIDARG;
 if (FAILED(hr = pDSCB->QueryInterface(IID_IDirectSoundNotify, (LPVOID*)&pDSNotify)))
 {
  return hr;
 }
 if (FAILED(hr = pDSCB->GetFormat(&wfx, sizeof(WAVEFORMATEX), NULL)))
 {
  return hr;
 }

 // Create events.
 for (int i = 0; i < cEvents; ++i)
 {
  rghEvent[i] = CreateEvent(NULL, TRUE, FALSE, NULL);
  if (NULL == rghEvent[i])
  {
   hr = GetLastError();
   return hr;
  }
 }
 // Describe notifications.
 rgdsbpn[0].dwOffset = (wfx.nAvgBytesPerSec/2) -1;
 rgdsbpn[0].hEventNotify = rghEvent[0];
 rgdsbpn[1].dwOffset = wfx.nAvgBytesPerSec - 1;
 rgdsbpn[1].hEventNotify = rghEvent[1];
 rgdsbpn[2].dwOffset = DSBPN_OFFSETSTOP;
 rgdsbpn[2].hEventNotify = rghEvent[2];
 // Create notifications.
 hr = pDSNotify->SetNotificationPositions(cEvents, rgdsbpn);
 pDSNotify->Release();
 return hr;
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved