Windows c ++ waveInStart, как получить доступ к записанным данным и управлять ими?

Я хочу записать звук с микрофона под 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 выборок), сэмплирование того, что я записал, для получения выборок 16 кГц (так что я бы разделил данные на 3) и применить алгоритм ulaw и отправлять все через udp. Вот почему мой буфер такой маленький (NUMPTS = 1536 шорт -> 3072 байта).
После сна 100 миллисекунд, я проверил, что есть в waveIn, но все 0 …
(ну, конечно, мой микрофон работает правильно)

0

Решение

Функция waveInOpen предоставляет четыре опции обратного вызова, которые уведомляют вас о заполнении буфера. Используйте один из этих вариантов.

Вы также должны выделить второй буфер и вывести его сразу после первого. Он будет поставлен в очередь в драйвере и без проблем переключится в режим после заполнения первого буфера.

0

Другие решения


По вопросам рекламы [email protected]