サウンドカードレートを44100などに設定すると、実際のレートが44100になることを保証することはできません。私の場合、アプリケーションとALSA間のトラフィック測定値(サンプル/秒) 44066 ... 44084。サンプリングレート偏差とサウンド再生位置
これはリサンプリングの問題に関連するものではありません。「44100」モードでは48000ハードウェアだけで44100の速度でデータを「食べる」必要があります。
この波形が再生されている間、波形上にカーソルを描こうとすると問題が発生します。
long long getCurrentTimeMs(void)
{
boost::posix_time::ptime now = boost::posix_time::microsec_clock::local_time();
boost::posix_time::ptime epoch_start(boost::gregorian::date(1970,1,1));
boost::posix_time::time_duration dur = now - epoch_start;
return dur.total_milliseconds();
}
:私は、次のC++の関数を使用して、カーソルのWAVファイルから読み込む "理想的な" サンプリングレートを用いた位置(22050、...、44100、...、48000)、スタートをプレイした後に費やしたミリ秒を計算しますQTimerは、カーソルアニメーションのフレームを生成するために使用されますが、QTimerの精度には依存しません。なぜなら、getCurrentTimeMs()で時間を尋ねるので(それは十分正確です)、フレームレートを変えることができます。
2〜3分再生した後、私は何を聞いているのか、私が見ているものに少し違いがあることを見ています - カーソルの位置は1/20秒程度の位置を演奏するよりも大きいです。
私がALSAのコールバックを通過するトラフィックを測定すると、平均値は44083.7サンプル/秒になります。次に、私は実際のレートとして画面描画関数でこの値を使用します。今問題は消える。プログラムはクロスプラットフォームなので、後でWindowsと別のサウンドカードでこの測定値をテストします。
しかし、サウンドと画面を同期させるより良い方法はありますか?サウンドカードに実際に演奏しているサンプル番号などをCPUで消費する方法はありませんか?