波形捕捉:(6)“捕捉缓冲区”通知

 

“捕捉缓冲区”通知



      想要定期的将数据从“捕捉缓冲区”复制出来,你的应用程序必须知道什么时候这个读指针(读指针的位置就是可以安全读取数据的最高位置)到达缓冲区中特定的位置。获取这个信息的一个办法是通过 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值