public static extern int waveInAddBuffer(IntPtr hwi, ref WaveHdr pwh, int cbwh);
static void waveInCallback(IntPtr hdrvr, int uMsg, int dwUser, ref WaveHdr wavehdr, int dwParam2) { // byte[] soundBuffer = new byte[bufferSize]; if (uMsg == MM_WIM_DATA) { // Marshal.Copy(wavehdr.lpData, soundBuffer, 0, bufferSize); // bw.Write(soundBuffer); waveInUnprepareHeader(hdrvr, ref wavehdr, Marshal.SizeOf(wavehdr)); waveInPrepareHeader(hdrvr, ref wavehdr, Marshal.SizeOf(wavehdr)); waveInAddBuffer(hdrvr, ref wavehdr, Marshal.SizeOf(wavehdr)); analyze(wavehdr); } }
static void analyze(WaveHdr wavehdr) { int index = 0, count = 0; int size = wavehdr.dwBytesRecorded / sizeof(short); short[] soundBuffer = new short[size]; Marshal.Copy(wavehdr.lpData, soundBuffer, 0, size); while (index < size) { bool bit = soundBuffer[index++] > 0; count++; while (index < size && bit == (bool)(soundBuffer[index] > 0)) { index++; count++; } processBit(bit, count); count = 0; } }
static void Main(string[] args) { //StreamWriter sw = new StreamWriter("output.dat", false); //bw = new BinaryWriter(sw.BaseStream); int ret; IntPtr waveIn; WaveHdr waveHeader1 = new WaveHdr(); WaveHdr waveHeader2 = new WaveHdr(); GCHandle wh1 = GCHandle.Alloc(waveHeader1, GCHandleType.Pinned); GCHandle wh2 = GCHandle.Alloc(waveHeader2, GCHandleType.Pinned); WaveFormat wf = new WaveFormat(); wf.wFormatTag = 1; // 1 is PCM wf.nChannels = 1; wf.nSamplesPerSec = sampleRate; wf.wBitsPerSample = 16; wf.nBlockAlign = 2; wf.cbSize = 0; wf.nAvgBytesPerSec = wf.nSamplesPerSec * wf.wBitsPerSample / 8; d = new WaveDelegate(waveInCallback); int devID = -1; int callbackInstance = 0; ret = waveInOpen(out waveIn, devID, ref wf, d, ref callbackInstance, CALLBACK_FUNCTION); if (ret != 0) return; waveHeader1.dwBufferLength = bufferSize; waveHeader2.dwBufferLength = bufferSize; waveHeader1.lpData = Marshal.AllocHGlobal(bufferSize); waveHeader2.lpData = Marshal.AllocHGlobal(bufferSize); ret = waveInPrepareHeader(waveIn, ref waveHeader1, Marshal.SizeOf(waveHeader1)); ret = waveInAddBuffer(waveIn, ref waveHeader1, Marshal.SizeOf(waveHeader1)); ret = waveInPrepareHeader(waveIn, ref waveHeader2, Marshal.SizeOf(waveHeader2)); ret = waveInAddBuffer(waveIn, ref waveHeader2, Marshal.SizeOf(waveHeader2)); ret = waveInStart(waveIn); Keyboard keyboard = new Keyboard(); while (true) { Thread.Sleep(100); if (keyboard.AltKeyDown == true) break; } ret = waveInStop(waveIn); ret = waveInClose(waveIn); //bw.Close(); }
public static extern int waveInUnprepareHeader(IntPtr hWaveIn, ref WaveHdr lpWaveInHdr, int uSize);