2012-12-24 71 views
0

我正在使用DirectSoundFullDuplexCreate8進行錄製,並且在某些情況下在Win 7下播放。我有幾個問題。有關DirectSoundFullDuplexCreate8的兩個問題

一個非常簡單 - 將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事件處理函數的任何引用。

回答

1

歡迎來到StackOverflow。爲了將來的參考,最好一次詢問一個精確的問題。

一個非常簡單 - 將FullDuplex與所有音頻硬件一起工作嗎?

如果內存服務,我不這麼認爲。特別是如果硬件是USB或捕捉和錄音設備不在同一張聲卡上。如果它能夠在不同的物理設備(或USB)上運行,您可能不會從AEC那裏獲得任何好處。

我相信你想要使用DirectSoundFullDuplexCreate而不是手動創建捕獲和回放對象分離的唯一原因是AEC(聲學回聲消除支持)。而如果內存服務,Windows中爲DirectSound內置的AEC並不是很好,並且不會很好地實現回聲消除。 (因人而異)

MSDN

訪問Windows XP中聲學回聲消除 現有的應用程序(AEC)通過的DirectSound API功能在Windows Vista上運行時將不再 獲得AEC。

以上將適用於Windows 7,因此,考慮DirectSoundFullDuplexCreate作爲一個死API。只需手動分別創建一個捕捉和回放緩衝區。

如果您需要AEC,您可以查看使用AEC系統過濾器。 Windows SDK中有一箇舊的示例應用程序,向您展示如何使用它。 http://msdn.microsoft.com/en-us/library/ff536174.aspx

但我看不到如何設置記錄事件通知。下面是到目前爲止,我已經得到了代碼,但我不明白如何開始記錄或如何設置的東西,這樣我就可以複製的數據記錄到其它緩衝劑,包括播放緩衝:

而且,在DirectSound對象上設置事件句柄可能不可靠。您最好定期輪詢捕獲和回放緩衝區位置(IDirectSoundCaptureBuffer8 :: GetCurrentPosition)。你必須處理所有提早起牀和事件處理遲到的情況。所以Sleep()將和WaitForSingleObject一樣工作。

要開始錄音,請撥打IDirectSoundCaptureBuffer8 ::開始()

沒有其他問題?

+0

謝謝,這回答我的問題。我沒有看到引用AEC被禁用。 – TomJeffries