IAudioClient :: SetEventHandle可以只被调用一次吗?

时间:2019-03-27 13:00:58

标签: audio windows-10

下面是一些简化的代码示例来说明我的问题:

bool Signaled(HANDLE const e)
{

return WaitForSingleObject(e, 0) == WAIT_OBJECT_0;

}

void SomeFunction()
{

HANDLE const e1 = CreateEvent(NULL, FALSE, FALSE, NULL); // not signaled
HANDLE const e2 = CreateEvent(NULL, FALSE, FALSE, NULL); // not signaled
HANDLE const e3 = CreateEvent(NULL, FALSE, FALSE, NULL); // not signaled

// let f() be a function that creates the object behind IAudioClient
// with AUDCLNT_SHAREMODE_EXCLUSIVE and AUDCLNT_STREAMFLAGS_EVENTCALLBACK
// but does not call IAudioClient::SetEventHandle
IAudioClient * const a = f(); // assume success

a->SetEventHandle(e1); // initial call, returns S_OK

assert(!Signaled(e1)); // true

a->SetEventHandle(e2); // subsequent call, returns S_OK

assert(!Signaled(e1)); // true
assert(!Signaled(e2)); // true

a->SetEventHandle(e3); // subsequent call, returns S_OK

assert(!Signaled(e1)); // true
assert(!Signaled(e2)); // true
assert(!Signaled(e3)); // true 

a->Start(); // returns S_OK

assert(!Signaled(e1)); // true, as I expected
assert(!Signaled(e2)); // false!!!
assert(Signaled(e3)); // may be true or false, that's OK

}

令我惊讶的是,也发出了e2信号。为什么?

文档没有说IAudioClient :: SetEventHandle只能被精确地调用一次,然后再也不能调用。

如果可以使用与当前事件句柄不同的事件句柄再次调用它,我希望当前事件句柄可以简单地被新事件句柄代替。但是似乎IAudioClient可以保留两个事件句柄,然后在Start()上发出信号。据我了解WASAPI及其事件回调机制,这没有任何意义。

还是IAudioClient包含最近两个事件句柄的列表?还是这是IAudioClient中的错误?还是文档不完整?

非常感谢您的帮助。拉里·奥斯特曼(Larry Osterman),如果您应该阅读此书,可以解释一下吗?

0 个答案:

没有答案