2012-05-31 229 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,它没有延迟问题。