我正在尝试使用 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。
谁能发现上述代码有什么问题可以解释为什么我没有得到任何数据?非常感谢任何输入。谢谢你。