我正在使用DirectSoundFullDuplexCreate8进行录制,并且在某些情况下会在Win 7下回放。我有几个问题。
一个非常简单-FullDuplex是否可以与所有音频硬件一起使用?在某些情况下,我们将使用不同的设备进行记录和播放。到目前为止,这似乎可行,但是,如果某些机器不支持全双工的Win版本,我们可以自行推出。
另一个可能是一个愚蠢的问题,但是我看不到如何设置事件通知进行记录。这是到目前为止的代码,但是我看不到如何开始记录或如何进行设置,以便将记录的数据复制到其他缓冲区,包括回放缓冲区:
hr = DirectSoundFullDuplexCreate8((LPCGUID)recordDeviceDS, (LPCGUID)playbackDeviceDS&capBufferDescription, &playBufferDescription, hWnd, DSSCL_PRIORITY, &pDSFullDuplex, &pDSCaptureBuffer8, &pDSPlayBuffer8, NULL );
if (hr != DS_OK)
return false;
// Set up the notify events
hr = pDSCaptureBuffer8->QueryInterface(IID_IDirectSoundNotify, (LPVOID*)&pDSNotify);
if (hr != DS_OK)
return false;
for (int i = 0; i < 3; ++i)
{
eventHandles[i] = CreateEvent(NULL, TRUE, FALSE, NULL);
if (eventHandles[i] == NULL)
return false;
}
notifyEvents[0].dwOffset = 500;
notifyEvents[0].hEventNotify = eventHandles[0];
notifyEvents[1].dwOffset = 1000;
notifyEvents[1].hEventNotify = eventHandles[1];
notifyEvents[2].dwOffset = DSBPN_OFFSETSTOP;
notifyEvents[2].hEventNotify = eventHandles[2];
hr = pDSNotify->SetNotificationPositions(NUM_CAP_EVENTS, notifyEvents);
if (hr != DS_OK)
return false;
pDSNotify->Release();
接下来是什么?我假设我使用:
pDSCaptureBuffer8->Start(true);
开始捕获,但我看不到任何有关如何设置DS事件处理程序功能的引用,该功能将在积累了正确数量的数据后激活。
最佳答案
欢迎使用StackOverflow。为了将来引用,最好一次提出一个精确的问题。
如果有记忆,我不这么认为。特别是在硬件是USB或捕获和记录设备不在同一声卡上的情况下。而且,如果它确实可以在不同的物理设备(或USB)上运行,那么您可能不会从中获得任何好处,例如AEC。
我相信,为什么要使用DirectSoundFullDuplexCreate而不是仅手动创建捕获和回放对象分离的唯一原因是AEC(回声消除支持)。而且,如果有内存可用,则Windows中DirectSound的内置AEC效果不是很好,并且回声消除效果也不会很好。 (YMMV)
根据MSDN:
以上内容适用于Windows7。因此,请将DirectSoundFullDuplexCreate视为无效的API。只需分别手动创建捕获和回放缓冲区。
如果需要AEC,则可以使用AEC系统筛选器。 Windows SDK中有一个旧的示例应用程序,向您展示了如何使用它。 http://msdn.microsoft.com/en-us/library/ff536174.aspx
此外,在DirectSound对象上设置事件句柄可能不可靠。最好只定期轮询捕获和回放缓冲区的位置(IDirectSoundCaptureBuffer8::GetCurrentPosition)。您必须处理所有使用事件句柄提早醒来和晚醒来的情况。因此,Sleep()和WaitForSingleObject一样好。
要开始记录,请调用IDirectSoundCaptureBuffer8::Start()
还有其他问题吗?