2011-01-31 211 views
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; 
} 

回答

3

僅僅因爲你問一個10kHz的採樣率,這並不意味着你的硬件支持。許多聲卡只支持一個或兩個採樣率 - 煤礦例如僅支持以下:

$ grep -rH rates /proc/asound/ | cut -d : -f 2- | sort -u 
    rates [0x160]: 44100 48000 96000 
    rates [0x560]: 44100 48000 96000 192000 
    rates [0x5e0]: 44100 48000 88200 96000 192000 

因此,你必須檢查SOUND_PCM_WRITE_RATEioctl()的返回值來驗證你得到了你想要的速度如所提到的here

SOUND_PCM_WRITE_RATE

設置在每秒採樣的採樣率。請記住,所有聲卡 的範圍都有限制; 驅動程序將將速率四捨五入到硬件 支持的最接近速度 ,並返回參數中實際的 (舍入)速率。

+0

我已經檢查過,聲卡與速度即時設置兼容,進一步做一個SOUND_PCM_READ_RATE ioctl我可以讀回我設置的速度,它工作正常。進一步測試後,我發現一些如何重複從/ dev/dsp1中讀取的塊,就好像一旦我讀取數據,它不會從緩衝區中移出我不知道爲什麼會出現這種情況? – farhan 2011-01-31 23:33:58