WINAPI音频输出(winapi audio output)

2019-09-17 16:21发布

我寻找窗户的PulseAudio的有些另类。 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)
    );
}

它的工作,但是当我送另一块的数据我听到片之间小的延迟。 任何其他方式的数据缓冲器的输出小块到声音设备?

Answer 1:

如果你想播放一些音频文件,您可以使用Windows API的PlaySound功能。

对于存储在内存中的数据块,你必须使用波形API - waveOutXXX功能。

对于音频的数据块之间的延迟问题,你必须使用一些双缓冲机制。

你可以在这里找到一个例子: 双缓冲



Answer 2:

我创建了组装此功能在几个月前,也许它可以对您有用:

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



Answer 3:

XAudio2是在Windows上最好的音频API。 这下WINMM,DirectSound的和其他Windows音频框架包装。 这很容易为pulseaudio的使用,它有潜伏期没有任何问题。



文章来源: winapi audio output