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