波形音频通过回叫,未收到数据

时间:2011-04-08 17:36:55

标签: c# windows winmm

我正在尝试使用C#中的WaveForm音频功能从麦克风中读取。现在我没有这个库的经验,所以可能只是因为我遗漏了一些明显的东西。

我能够成功(至少没有返回错误)打开设备,添加缓冲区,然后启动该设备。如下:

short nChannels = 2;
uint nSamplesPerSec = 44100;
short nBitsPerSample = 16;
uint DeviceID = 0;

WAVEFORMATEX Format = new WAVEFORMATEX();
Format.wFormatTag = 0x0001;
Format.nChannels = nChannels;
Format.nSamplesPerSec = nSamplesPerSec;
Format.wBitsPerSample = nBitsPerSample;
Format.nAvgBytesPerSec = ((uint)nBitsPerSample / 8) * nSamplesPerSec;
Format.nBlockAlign = (short)((nChannels * nBitsPerSample) / 8);
Format.cbSize = 0;

WAVEHDR BufHeader = new WAVEHDR();
BufHeader.lpData = Marshal.AllocHGlobal((int)Format.nAvgBytesPerSec);
BufHeader.dwBufferLength = Format.nAvgBytesPerSec;
BufHeader.dwUser = 0;
BufHeader.dwFlags = 0;

uint err;
err = waveInOpen(ref HWI, DeviceID, ref Format, new waveInProc(waveInCbk), 0, 0x00030000);
err = waveInPrepareHeader(HWI, ref BufHeader, (uint)Marshal.SizeOf(typeof(WAVEHDR)));
err = waveInAddBuffer(HWI, ref BufHeader, (uint)Marshal.SizeOf(typeof(WAVEHDR)));
err = waveInStart(HWI);

请注意,我已通过调试器检查了err的值,它始终为0.此外,我已查看了Device 0的属性。共享时的默认音频格式为44.1 kHz,2通道,16 bps(我正在使用)。使用的回调函数是:

private void waveInCbk(IntPtr hwi, WAVEINCBKMSG uMsg, IntPtr dwInstance, IntPtr dwParam1, IntPtr dwParam2)
{
    switch(uMsg)
    {
        case WAVEINCBKMSG.WIM_CLOSE:
            break;
        case WAVEINCBKMSG.WIM_OPEN:
            break;
        case WAVEINCBKMSG.WIM_DATA:
            System.Console.WriteLine("Received data!"); // Never Reached!
            break;
    }            
}

另外值得注意的是,在我调用waveinOpen之后,使用WIM_OPEN成功调用了一次回调。如果有必要,我可以发布我的pinvoke用于wave函数,但大多数情况下它们来自pinvoke.net。

有人能发现上述代码有什么问题可以解释为什么我没有得到任何数据吗?任何输入都非常感谢。谢谢。

1 个答案:

答案 0 :(得分:0)

好吧,我好像已经解决了这个问题。我会在这里为遇到同样问题的其他人发布原因。

我只添加了1个以上的缓冲区。在这样做时,我现在通过回调接收数据!