“捕捉缓冲区”通知



      想要定期的将数据从“捕捉缓冲区”复制出来,你的应用程序必须知道什么时候这个读指针(读指针的位置就是可以安全读取数据的最高位置)到达缓冲区中特定的位置。获取这个信息的一个办法是通过 IDirectSoundCaptureBuffer8::GetCurrentPosition 方法轮询读指针的位置。另一种更有效的办法是使用通知(notification)。使用 IDirectSoundNotify8::SetNotificationPositions 方法,你可以在缓冲区中设置若干个点,在这些点上会触发事件。你不能在缓冲区正在使用的时候设置它。

      首先,你必须得到 IDirectSoundNotify8 接口。你可以通过使用缓冲区对象的 QueryInterface 方法得到。

      使用Win32  CreateEvent 方法为每一个通知的位置创建一个事件对象。将这个事件的句柄放置在一个 DSBPOSITIONNOTIFY 结构体的 hEventNotify 成员中。在这个结构体的 dwOffset 成员中,指定在缓冲区中你想要事件被触发的偏移量。如果你想要设置多个通知位置那么就传递这个结构体(或结构体数组)的地址给 SetNotificationPositions方法。

     下面的例子在一秒钟的缓冲区中设置了三个通知位置。第一个事件将在读指针接近缓冲区中点的时候被触发,另一个事件将在读指针缓冲区终点的时候被触发,第三个则会在捕捉停止的时候被触发。

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.创建“捕捉设备对象”
      3.“捕捉设备”性能
      4.创建一个“捕捉缓冲区”
      5.“捕捉缓冲区”信息
      6.“捕捉缓冲区”通知
      7. “捕捉缓冲区”特效
      8.使用“捕捉缓冲区”
      9.写入到WAV文件 

相关文章: