Windows c++waveInStart如何访问记录的数据并对其进行管理

Windows c++ waveInStart how to access to recorded data and managing it?

本文关键字:数据 管理 记录 何访问 c++waveInStart 访问 Windows      更新时间:2023-10-16

我想在Windows下录制一些麦克风的音频,所以我使用wave API。

这就是我所做的

QByteArray tmp;
QByteArray data;
char dst[SAMPLES_TO_SEND];
qint64 tot=0;
const int NUMPTS = SAMPLES_TO_SEND*3;
int sampleRate = 48000;
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
HWAVEIN      hWaveIn;
WAVEHDR      WaveInHdr;
MMRESULT result;
// Specify recording parameters
WAVEFORMATEX pFormat;
pFormat.wFormatTag=WAVE_FORMAT_PCM;     // simple, uncompressed format
pFormat.nChannels=1;                    //  1=mono, 2=stereo
pFormat.nSamplesPerSec=sampleRate;      // 48000
pFormat.nAvgBytesPerSec=sampleRate*2;   // = nSamplesPerSec * n.Channels * wBitsPerSample/8
pFormat.nBlockAlign=2;                  // = n.Channels * wBitsPerSample/8
pFormat.wBitsPerSample=16;              //  16 for high quality, 8 for telephone-grade
pFormat.cbSize=0;
result = waveInOpen(&hWaveIn, WAVE_MAPPER,&pFormat, 0L, 0L, WAVE_FORMAT_DIRECT);
if (result)
{
    WCHAR fault[256];
    waveInGetErrorText(result, fault, 256);
    return -1;
}
// Set up and prepare header for input
WaveInHdr.lpData = (LPSTR)waveIn;
WaveInHdr.dwBufferLength = NUMPTS*2;
WaveInHdr.dwBytesRecorded=0;
WaveInHdr.dwUser = 0L;
WaveInHdr.dwFlags = 0L;
WaveInHdr.dwLoops = 0L;
waveInPrepareHeader(hWaveIn, &WaveInHdr, sizeof(WAVEHDR));
// Insert a wave input buffer
result = waveInAddBuffer(hWaveIn, &WaveInHdr, sizeof(WAVEHDR));
if (result)
{
    return -1;
}
// Commence sampling input
result = waveInStart(hWaveIn);
if (result)
{
 return -1;
}

在这一点上,我必须做些什么来访问和管理记录的数据?我的最终目标是连续记录小数据(我希望每次都准确地记录512个样本),对我记录的数据进行二次采样,以获得16kHz的样本(所以我会将数据除以3),并应用ulaw算法,并通过udp发送所有数据。这就是为什么我的缓冲区如此之小(NUMPTS=1536 shorts->3072字节)。睡了100毫秒后,我检查了waveIn中有什么,但都是0。。。(当然,我的麦克风工作正常)

waveInOpen函数提供四个回调选项,用于在缓冲区已填充时通知您。使用其中一个选项。

您还应该分配第二个缓冲区,并在第一个缓冲区之后立即输出。它将在驱动程序中排队,并在第一个缓冲区填满后无缝切换。