частота дискретизации аудиопотока в Linux - PullRequest
1 голос
/ 31 января 2011

Я пытаюсь прочитать и сохранить сэмплы с аудиомикрофона в Linux, используя C / C ++. Используя PCM ioctls, я настроил устройство, чтобы оно имело определенную частоту дискретизации, скажем, 10 кГц, используя SOUND_PCM_WRITE_RATE ioctl и т. Д. Устройство настроено правильно и после установки может читать с устройства, используя «read».

int got = read(itsFd, b.getDataPtr(), b.sizeBytes());

У меня проблема в том, что после установки соответствующей частоты дискретизации у меня есть поток, который непрерывно читает из / dev / dsp1 и сохраняет эти выборки, но количество выборок, которые я получаю за 1 секунду записи, далеко от выборки скорость и всегда на порядки больше, чем установленная частота дискретизации. Есть идеи, с чего начать выяснять, в чем может быть проблема?

EDIT:

Частичный исходный код:

/////////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;
}

1 Ответ

3 голосов
/ 01 февраля 2011

Если вы запрашиваете частоту дискретизации 10 кГц, это не означает, что ваше оборудование поддерживает ее.Многие звуковые карты поддерживают только одну или две частоты дискретизации - моя, например, поддерживает только эти:

$ 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

Устанавливает частоту дискретизации в выборках в секунду.Помните, что все звуковые карты имеют ограничение по дальности;драйвер округляет скорость до ближайшей скорости, поддерживаемой аппаратным обеспечением, возвращая фактическую (округленную) скорость в аргументе.

...