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のサンプリングレートを要求したからといって、ハードウェアがそれをサポートしているわけではありません。多くのサウンドカードは、1つまたは2つのサンプリングレートしかサポートしていません。たとえば、私の場合は次のレートしかサポートしていません。

$ 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

サンプリングレートを1秒あたりのサンプル数で設定します。すべてのサウンドカードには範囲の制限があることに注意してください。ドライバーは、レートをハードウェアでサポートされている最も近い速度に丸め、引数に実際の(丸められた)レートを返します。

于 2011-01-31T23:03:49.967 に答える