static byte[][] pBufferOut = new byte[2][]; // 用于录音的两块缓冲区 public void initWave() { // 初始化waveform waveform.wFormatTag = WAVE_FORMAT_PCM; // 采样方式,PCM(脉冲编码调制) waveform.nChannels = 1; // 单声道 waveform.nSamplesPerSec = 8000; // 采样率 8KHz waveform.nAvgBytesPerSec = 8000; // 数据率 8KB/s waveform.nBlockAlign = 1; // 最小块单元,wBitsPerSample×nChannels/8 waveform.wBitsPerSample = 8; // 样本大小为8bit waveform.cbSize = 0; // 附加格式信息 for (int HdrNum = 0; HdrNum < 2; HdrNum++) { // 为缓冲区分配内存 pBufferIn[HdrNum] = new byte[INP_BUFFER_SIZE * 2]; // 播放缓冲区 pBufferOut[HdrNum] = new byte[INP_BUFFER_SIZE]; // 录音缓冲区 pWaveHdrIn[HdrNum] = new waveStruct.wavehdr_tag(); // 录音设备结构 pWaveHdrOut[HdrNum] = new waveStruct.wavehdr_tag(); // 播放设备结构 pWaveHdrOut[HdrNum].lpData = pBufferOut[HdrNum]; pWaveHdrOut[HdrNum].dwBufferLength = INP_BUFFER_SIZE * 2; pWaveHdrOut[HdrNum].dwBytesRecorded = 0; pWaveHdrOut[HdrNum].dwUser = 0; pWaveHdrOut[HdrNum].dwFlags = WHDR_BEGINLOOP | WHDR_ENDLOOP; pWaveHdrOut[HdrNum].dwLoops = 1; pWaveHdrOut[HdrNum].lpNext = IntPtr.Zero; pWaveHdrOut[HdrNum].reserved = 0; pWaveHdrIn[HdrNum].lpData = pBufferOut[HdrNum]; pWaveHdrIn[HdrNum].dwBufferLength = INP_BUFFER_SIZE; pWaveHdrIn[HdrNum].dwBytesRecorded = 0; pWaveHdrIn[HdrNum].dwUser = 0; pWaveHdrIn[HdrNum].dwFlags = WHDR_BEGINLOOP | WHDR_ENDLOOP; pWaveHdrIn[HdrNum].dwLoops = 1; pWaveHdrIn[HdrNum].lpNext = IntPtr.Zero; pWaveHdrIn[HdrNum].reserved = 0; } int result = 0; // 打开播放波形音频设备 result = WaveAPI.waveOutOpen(hWaveOut, WAVE_MAPPER, ref waveform, 0, 0, CALLBACK_WINDOW); // 打开录制波形音频设备 if (result == 0) { result = WaveAPI.waveInOpen(hWaveIn, WAVE_MAPPER, ref waveform, 0, 0, CALLBACK_WINDOW); } }
public static extern int waveOutPrepareHeader(IntPtr hwave, ref waveStruct.wavehdr_tag wavehdr, int usize);