2

私は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)
    );
}

動作していますが、別のデータを送信すると、ピース間にわずかな遅延が聞こえます。データバッファの小さなチャンクをサウンドデバイスに出力する他の方法はありますか?

4

3 に答える 3

4

オーディオファイルを再生する場合は、WindowsAPIのPlaySound関数を使用できます。

メモリに保存されているデータのチャンクについては、WaveformAPI-waveOutXXX関数を使用する必要があります。

オーディオのチャンク間の遅延に関する問題については、いくつかのダブルバッファリングメカニズムを使用する必要があります。

ここに例があります: ダブルバッファリング

于 2012-05-31T12:32:39.660 に答える
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

于 2012-05-31T22:32:48.587 に答える
0

XAudio2はWindowsで最高のオーディオAPIです。これは、WinMM、DirectSound、およびその他のWindowsオーディオフレームワークのラッパーです。pulseaudioとして使いやすく、レイテンシーの問題はありません。

于 2012-06-07T09:04:14.093 に答える