1

我正在尝试使用 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;
}
4

1 回答 1

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_RATE ioctl()以验证您是否获得了所需的汇率,如此所述:

SOUND_PCM_WRITE_RATE

以每秒样本数为单位设置采样率。请记住,所有声卡都有范围限制;驱动程序会将速率四舍五入到硬件支持的最接近的速度,并在参数中返回实际(四舍五入)速率。

于 2011-01-31T23:03:49.967 回答