Windows-发出噪音的录音程序

Windows-发出噪音的录音程序,windows,audio,wav,Windows,Audio,Wav,我编写了以下程序,通过windows中的声卡录制声音,并从waveheader的缓冲区打印PCM数据。但它只给出了32600-32700的数据。我的声卡有问题吗?我使用了自动选择源的WAVE_映射器…请帮助我 #include <Windows.h> #include <MMSystem.h> #include <iostream> using namespace std; int main(){ HWAVEIN microHandle; WAVEH

我编写了以下程序,通过windows中的声卡录制声音,并从waveheader的缓冲区打印PCM数据。但它只给出了32600-32700的数据。我的声卡有问题吗?我使用了自动选择源的WAVE_映射器…请帮助我

#include <Windows.h>
#include <MMSystem.h>
#include <iostream>

using namespace std;

int main(){



HWAVEIN microHandle;
WAVEHDR waveHeader;
MIXERCAPS mixerCaps;
WAVEFORMATEX format;
//HWAVEOUT hwo;    // play

while (1){


const int NUMPTS = 44100 * 0.01;   // 10 seconds
int sampleRate = 44100;      //can get frequency from here
short int waveIn[NUMPTS];   // 'short int' is a 16-bit type; I request 16-bit samples below
// for 8-bit capture, you'd use 'unsigned char' or 'BYTE' 8-bit types

MMRESULT result = 0;

format.wFormatTag = WAVE_FORMAT_PCM;      // simple, uncompressed format
format.wBitsPerSample = 8;                //  16 for high quality, 8 for telephone-grade
format.nChannels = 1;                     //  1=mono, 2=stereo
format.nSamplesPerSec = sampleRate;       //  22050
format.nAvgBytesPerSec = format.nSamplesPerSec*format.nChannels*format.wBitsPerSample / 8;
// = nSamplesPerSec * n.Channels * wBitsPerSample/8
format.nBlockAlign = format.nChannels*format.wBitsPerSample / 8;
// = n.Channels * wBitsPerSample/8
format.cbSize = 0;

result = waveInOpen(&microHandle, WAVE_MAPPER, &format, 0L, 0L, WAVE_FORMAT_DIRECT);

cout << "checking step 1" << endl;

if (result)
{
    cout << "Fail step 1" << endl;
    cout << result << endl;
    Sleep(10000);
    return 0;
}

// Set up and prepare header for input
waveHeader.lpData = (LPSTR)waveIn;
waveHeader.dwBufferLength = NUMPTS;// *2;//why *2
waveHeader.dwBytesRecorded = 0;
waveHeader.dwUser = 0L;
waveHeader.dwFlags = 0L;
waveHeader.dwLoops = 0L;
waveInPrepareHeader(microHandle, &waveHeader, sizeof(WAVEHDR));

// Insert a wave input buffer
result = waveInAddBuffer(microHandle, &waveHeader, sizeof(WAVEHDR));

int NumOfMixers = mixerGetNumDevs();
cout << NumOfMixers << endl;

//cout<<(char*)mixerCaps.szPname<<endl;

//system("pause");

cout << "checking step 2" << endl;

if (result)
{
    cout << "Fail step 2" << endl;
    cout << result << endl;
    Sleep(10000);
    return 0;
}
//system("pause");

result = waveInStart(microHandle);

cout << "checking step 3......started recording..." << endl;

if (result)
{
    cout << "Fail step 3" << endl;
    cout << result << endl;
    Sleep(10000);
    return 0;
}

// Wait until finished recording
do { cout << "still"; } while (waveInUnprepareHeader(microHandle, &waveHeader, sizeof(WAVEHDR)) == WAVERR_STILLPLAYING);

waveInStop(microHandle);
waveInReset(microHandle);
//waveInUnprepareHeader(hwi, lpWaveHdr, sizeof(WAVEHDR));
waveInClose(microHandle);

//printing the buffer
for (int i = 0; i < waveHeader.dwBufferLength; i++)
{
    if (waveIn[i] > 0)
        cout << i << "\t" << waveIn[i] << endl;
}


}
    system("pause");
    //waveInClose(microHandle);

    return 0;
}
#包括
#包括
#包括
使用名称空间std;
int main(){
静脉微柄;
波头;
混合器捕捉器混合器捕捉器;
波形格式;
//HWAVEOUT hwo;//播放
而(1){
常量int NUMPTS=44100*0.01;//10秒
int sampleRate=44100;//可以从这里获取频率
short int waveIn[NUMPTS];/“short int”是一种16位类型;我要求在下面提供16位示例
//对于8位捕获,您将使用“unsigned char”或“BYTE”8位类型
MMRESULT结果=0;
format.wFormatTag=WAVE\u format\u PCM;//简单的未压缩格式
format.wBitsPerSample=8;//16表示高质量,8表示电话等级
format.nChannels=1;//1=单声道,2=立体声
format.nSamplesPerSec=sampleRate;//22050
format.nAvgBytesPerSec=format.nSamplesPerSec*format.nChannels*format.wBitsPerSample/8;
//=nSamplesPerSec*n.通道*wBitsPerSample/8
format.nblockallign=format.nChannels*format.wBitsPerSample/8;
//=n个通道*wBitsPerSample/8
format.cbSize=0;
结果=waveInOpen(µHandle,WAVE_MAPPER,&format,0L,0L,WAVE_format_DIRECT);

cout一个明显的问题是您混合使用16位和8位。您的缓冲区定义为16位短。请注意您自己的评论:

short int waveIn[NUMPTS];   // 'short int' is a 16-bit type; I request 16-bit samples below
// for 8-bit capture, you'd use 'unsigned char' or 'BYTE' 8-bit types
但是,在定义音频格式时,您指定的是8位:

format.wBitsPerSample = 8; //  16 for high quality, 8 for telephone-grade
更改
format.wBitsPerSample=16
,或者如果需要8位音频,请执行以下操作:

unsigned char waveIn[NUMPTS];
...
format.wBitsPerSample = 8; //  16 for high quality, 8 for telephone-grade

//printing the buffer
for (int i = 0; i < waveHeader.dwBufferLength; i++)
{
    cout << i << "\t" << (int)waveIn[i] << endl;
}
unsigned char waveIn[NUMPTS];
...
format.wBitsPerSample=8;//16表示高质量,8表示电话等级
//打印缓冲区
对于(int i=0;icout一个明显的问题是您混合使用16位和8位。您的缓冲区定义为16位短。请注意您自己的评论:

short int waveIn[NUMPTS];   // 'short int' is a 16-bit type; I request 16-bit samples below
// for 8-bit capture, you'd use 'unsigned char' or 'BYTE' 8-bit types
但是,在定义音频格式时,您指定的是8位:

format.wBitsPerSample = 8; //  16 for high quality, 8 for telephone-grade
更改
format.wBitsPerSample=16
,或者如果需要8位音频,请执行以下操作:

unsigned char waveIn[NUMPTS];
...
format.wBitsPerSample = 8; //  16 for high quality, 8 for telephone-grade

//printing the buffer
for (int i = 0; i < waveHeader.dwBufferLength; i++)
{
    cout << i << "\t" << (int)waveIn[i] << endl;
}
unsigned char waveIn[NUMPTS];
...
format.wBitsPerSample=8;//16表示高质量,8表示电话等级
//打印缓冲区
对于(int i=0;i难道8位数字不应该适合16位变量并给出正确的结果吗?我已经从netYes上的某个地方复制了该程序,它将适合…正好两次。这就是问题所在。waveIn API将填充内存,就像它是一个字节数组。当您返回代码并将其视为不同类型的数组时不是这样的。8位数字不应该适合16位变量并给出正确的结果吗?我已经从netYes上的某个地方复制了该程序。它将正好适合…两次。这就是问题所在。waveIn API将填充内存,就好像它是一个字节数组。当您返回到代码中并将其视为一个不同字节的数组时类型不是这样的。8位数字不应该适合16位变量并给出正确的结果吗?我已经从netYes上的某个地方复制了该程序。它将正好适合…两次。这就是问题所在。waveIn API将填充内存,就像它是一个字节数组一样。当您返回代码并将其视为一个字节数组时不同的类型并不能使它如此。