2012-05-31 532 views
2

我正在尋找一些替代pulseaudio的windows。 linux下有非常簡單的方式來輸出原始聲音(帶的PulseAudio):winapi音頻輸出

pa_simple_write(pulse, data, bufferSize, &error); 

這是完美的工作與小緩衝區,我發在循環運行。

在windows下我用這樣的:

void writeAudioBlock(HWAVEOUT hWaveOut, LPSTR block, DWORD size) 
{ 
    WAVEHDR header; 

    ZeroMemory(&header, sizeof(WAVEHDR)); 
    header.dwBufferLength = size; 
    header.lpData = block; 

    waveOutPrepareHeader(hWaveOut, &header, sizeof(WAVEHDR)); 

    ResetEvent(waveDone); 

    waveOutWrite(hWaveOut, &header, sizeof(WAVEHDR)); 

    WaitForSingleObject(waveDone, INFINITE); 

    waveOutUnprepareHeader(
     hWaveOut, 
     &header, 
     sizeof(WAVEHDR) 
    ); 
} 

它的工作,但是當我送另一塊的數據我聽到片之間小的延遲。任何其他方式輸出小塊數據緩衝區聲音設備?

回答

4

如果你想播放一些音頻文件,你可以在Windows API中使用PlaySound功能。

對於存儲在內存中的數據塊,您必須使用波形API - waveOutXXX函數。

對於音頻塊之間的延遲問題,您必須使用一些雙緩衝機制。

您可以在這裏找到一個例子: double buffering

+0

好文章。我已經爲比賽做了一個很大的緩衝區,但是有一些問題需要用正確的方式填充。謝謝。 – DEgITx

+0

+1鏈接到展示雙緩衝的文章。 –

0

我創建了組裝此功能在幾個月前,也許它可能對你有用:

PlayMultimediaProc Proc hWin : DWORD, szFileName : DWORD 

    .data 
    lpDll db "msvfw32.dll", 0 
    lpFunc db "MCIWndCreate", 0 
    .code 
invoke GetModuleHandle, addr lpDll 
invoke GetProcAddress, eax, addr lpFunc 
mov esi, eax 
push szFileName 
push MCIWNDF_NOTIFYPOS or MCIWNDF_NOMENU or MCIWNDF_SHOWALL or MCIWNDF_SHOWNAME 
invoke GetModuleHandle, NULL 
push eax 
push hWin 
call esi 
Ret 

PlayMultimediaProc ENDP

0

XAudio2是在Windows上最好的音頻API。它是WinMM,DirectSound和其他Windows音頻框架下的包裝。它很容易用作pulseaudio,它沒有延遲問題。