Я пытаюсь читать и сохранять образцы с аудиомикрофона в Linux, используя C/C++. Используя ioctl PCM, я настраиваю устройство на определенную частоту дискретизации, скажем, 10 кГц, используя ioctl SOUND_PCM_WRITE_RATE и т. Д. Устройство правильно настраивается, и я могу считывать с устройства после настройки с помощью «чтения».
int got = read(itsFd, b.getDataPtr(), b.sizeBytes());
У меня проблема в том, что после установки соответствующей частоты дискретизации у меня есть поток, который постоянно читает из /dev/dsp1 и сохраняет эти сэмплы, но количество сэмплов, которые я получаю за 1 секунду записи, далеко от частоты дискретизации и всегда на несколько порядков больше установленной частоты дискретизации. Любые идеи, с чего начать, выясняя, в чем может быть проблема?
РЕДАКТИРОВАТЬ:
Частичный исходный код:
/////////main loop
while(goforever) {
// grab a buffer:
AudioBuffer<uint16> buffer;
agb->grab(buffer);
pthread_mutex_lock(&qmutex_data);
rec.push(buffer);
pthread_mutex_unlock(&qmutex_data);
if(tim.getSecs()>=5)
goforever =false;
}
////////////grab function:
template <class T>
void AudioGrabber::grab(AudioBuffer<T>& buf) const
{
AudioBuffer<T> b(itsBufsamples.getVal(),
itsStereo.getVal() ? 2U : 1U,
float(itsFreq.getVal()),
NO_INIT);
int got = read(itsFd, b.getDataPtr(), b.sizeBytes());
if (got != int(b.sizeBytes()))
PLERROR("Error reading from device: got %d of %u requested bytes",
got, b.sizeBytes());
buf = b;
}