Я пытаюсь использовать функции WaveForm Audio в C # для чтения с микрофона.Теперь у меня нет опыта работы с этой библиотекой, поэтому, возможно, я просто упускаю что-то очевидное.
Я могу успешно (по крайней мере, никаких ошибок не возвращать) открыть устройство, добавить буфер и запустить его.устройство.Следующее:
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 кГц, 2 канала, 16 бит / с (как я использую).Используемая функция обратного вызова:
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;
}
}
Также следует отметить, что обратный вызов успешно вызывается один раз с WIM_OPEN, после моего вызова waveinOpen.При необходимости я могу опубликовать свои pinvoke для волновых функций, но по большей части они из pinvoke.net.
Может кто-нибудь заметить что-то не так с приведенным выше кодом, который объяснил бы, почему я не получаю никаких данных?Любой вклад очень ценится.Спасибо.