1

C# で WaveForm Audio 関数を使用してマイクから読み取ろうとしています。今、私はこのライブラリの過去の経験がないので、明らかな何かが欠けているだけかもしれません.

デバイスを開き、バッファを追加し、そのデバイスを起動することに成功しました (少なくともエラーは返されませんでした)。次のように:

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 を使用してコールバックが 1 回正常に呼び出されることにも注意してください。必要に応じて、波動関数の pinvoke を投稿できますが、ほとんどの場合、pinvoke.net からのものです。

上記のコードで、データが得られない理由を説明する何か問題を誰かが見つけることができますか? どんな入力でも大歓迎です。ありがとうございました。

4

1 に答える 1

0

さて、私は問題を解決したようです。同じ問題に遭遇した他の人のために、ここに理由を投稿します。

複数のバッファを追加しただけです。これを行うと、コールバックを介してデータを受け取るようになりました!

于 2011-04-08T19:17:34.287 に答える