1
我试图使用C/C++在linux下读取和存储音频麦克风中的采样。使用PCM ioctls,我使用SOUND_PCM_WRITE_RATE ioctl等设置设备使其具有一定的采样率,例如10Khz。设备使用“读取”设置正确,并且能够在设置后读回设备。linux中的音频流采样率
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;
}
我已经检查过,声卡与速度即时设置兼容,进一步做一个SOUND_PCM_READ_RATE ioctl我可以读回我设置的速度,它工作正常。进一步测试后,我发现一些如何重复从/ dev/dsp1中读取的块,就好像一旦我读取数据,它不会从缓冲区中移出我不知道为什么会出现这种情况? – farhan 2011-01-31 23:33:58