我正在尝试使用 C/C++ 从 Linux 中的音频麦克风读取和存储样本。使用 PCM ioctl 我使用 SOUND_PCM_WRITE_RATE ioctl 等将设备设置为具有一定的采样率,例如 10Khz。设备设置正确,并且我能够在使用“读取”设置后从设备读取。
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;
}