您的位置:首页 > 其它

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

2009-04-26 12:25 176 查看
“捕捉缓冲区”通知

想要定期的将数据从“捕捉缓冲区”复制出来,你的应用程序必须知道什么时候这个读指针(读指针的位置就是可以安全读取数据的最高位置)到达缓冲区中特定的位置。获取这个信息的一个办法是通过 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: