Форма волны аудио через обратный вызов, данные не получены - PullRequest
1 голос
/ 08 апреля 2011

Я пытаюсь использовать функции 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.

Может кто-нибудь заметить что-то не так с приведенным выше кодом, который объяснил бы, почему я не получаю никаких данных?Любой вклад очень ценится.Спасибо.

1 Ответ

0 голосов
/ 08 апреля 2011

Ну, похоже, я решил проблему. Я опубликую причину здесь для тех, кто сталкивается с той же проблемой.

Я просто добавил более 1 буфера. При этом теперь я получаю данные через обратный вызов!

...