1

我正在尝试使用 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。此外,我查看了设备 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,但大部分来自 pinvoke.net。

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

4

1 回答 1

0

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

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

于 2011-04-08T19:17:34.287 回答