2011-01-31 127 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