【问题标题】:winapi audio outputwinapi 音频输出
【发布时间】:2012-06-05 16:52:31
【问题描述】:

我正在为 windows 寻找一些 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)
    );
}

它正在工作,但是当我发送另一条数据时,我听到各条之间的延迟很小。还有其他方法可以将小块数据缓冲区输出到声音设备吗?

【问题讨论】:

    标签: c++ winapi buffer pulseaudio


    【解决方案1】:

    如果你想播放一些音频文件,你可以使用 windows API 中的 PlaySound 函数。

    对于存储在内存中的数据块,您必须使用 Waveform API - waveOutXXX 函数。

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

    你可以在这里找到一个例子: double buffering

    【讨论】:

    • 好文章。我已经为播放制作了一个很大的缓冲区,但是有关于以正确方式填充它的问题。谢谢。
    • +1 链接到演示双缓冲的文章。
    【解决方案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

    【讨论】:

      【解决方案3】:

      XAudio2 是 Windows 上最好的音频 API。它是 WinMM、DirectSound 和其他 windows 音频框架下的包装器。它很容易用作pulseaudio,没有延迟问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多