我正在使用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()

还有其他问题吗?

09-25 21:46