我正在寻找一些替代的pulseaudio for windows。 在linux下,有一种非常简单的输出原始声音的方法(使用pulseaudio):
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)
);
}
它正在工作,但是当我发送另一条数据时,我听到片断之间的延迟很小。是否有其他方法可以将小块数据缓冲区输出到声音设备?
答案 0 :(得分:4)
如果您想播放一些音频文件,可以在Windows API中使用PlaySound功能。
对于存储在内存中的数据块,您必须使用Waveform API - waveOutXXX函数。
对于音频块之间的延迟问题,您必须使用一些双缓冲机制。
你可以在这里找到一个例子: double buffering
答案 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
答案 2 :(得分:0)
XAudio2是Windows上最好的音频API。它是WinMM,DirectSound和其他Windows音频框架下的包装器。它很容易用作pulseaudio,它没有延迟问题。