Я хочу записать звук с микрофона под 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 …
(ну, конечно, мой микрофон работает правильно)
Функция waveInOpen предоставляет четыре опции обратного вызова, которые уведомляют вас о заполнении буфера. Используйте один из этих вариантов.
Вы также должны выделить второй буфер и вывести его сразу после первого. Он будет поставлен в очередь в драйвере и без проблем переключится в режим после заполнения первого буфера.