ソニーPHA-3を購入し、ネイティブモードでDSDを再生するアプリを作成しようとしました。 (私はDoPモードに成功しました) しかし、私がsamplerateを2.8MHzに設定すると、ASIOCallbacks :: bufferSwitchTimeInfoがそれほど速くないことがわかりました。ASIOCallbacks :: bufferSwitchTimeInfoは2.8MHzで非常にゆっくりと進みます。ソニーPHA-3でDSDフォーマットのサンプラーテート
2.8MHzのサンプルを要求するのにおよそ8秒かかります。これは1秒で完了します。
コードは単にasiosdk 2.3のホストサンプルから変更されているため、私は質問を完了させるためにキーコードの一部を投稿します。
ASIOスタートした後、ホストサンプルは、このような時間情報を表示するプログレスを印刷続ける:
fprintf (stdout, "%d ms/%d ms/%d samples **%ds**", asioDriverInfo.sysRefTime,
(long)(asioDriverInfo.nanoSeconds/1000000.0),
(long)asioDriverInfo.samples,
(long)(**asioDriverInfo.samples/asioDriverInfo.sampleRate**));
最終的な式が経過した秒数を私に教えてくれます。 (asioDriverInfo.samples/asioDriverInfo.sampleRate)。
ここで、asioDriverInfo.sampleRateは2822400 Hzです。
そしてasioDriverInfo.samplesはASIOCallbacksに割り当てられ::以下のようなbufferSwitchTimeInfo:
if (timeInfo->timeInfo.flags & kSamplePositionValid)
asioDriverInfo.samples = ASIO64toDouble(timeInfo->timeInfo.samplePosition);
else
asioDriverInfo.samples = 0;
それは、サンプルの元のコードです。
私は非常にゆっくりと経過時間を見つけることができます。
私はサンプラーレートを2.8MHz * 4などもっと上げようとしましたが、1秒進める時間はもっと長くなっています。
サンプラーレートを2.8MHz以下に下げようとしましたが、APIが失敗しました。
私は確かにsdkのガイドに従ってSampleFormatを設定しました。
ASIOIoFormat aif; memset(& aif、0、sizeof(aif));
aif.FormatType = kASIODSDFormat;
ASIOSampleRate finalSampleRate = 176400;
if(ASE_SUCCESS == ASIOFuture(kAsioSetIoFormat,&aif)){
finalSampleRate = 2822400;
}
実際、SampleFormatをDSDに設定しないと、samplerateを2.8MHzに設定するとAPIが失敗する可能性があります。
最後に、すべてのDAW(Cubase/Reaper、...)がスレッドの優先度を設定するオプションを持っていることを思い出したので、コールバックのスレッドが十分ではなく、スレッドの優先度をこれが助けになるかどうかを見てください。しかし、スレッドの優先度をチェックすると、THREAD_PRIORITY_TIME_CRITICALが返されます。
static double processedSamples = 0;
if (processedSamples == 0)
{
HANDLE t = GetCurrentThread();
int p = GetThreadPriority(t); // I get THREAD_PRIORITY_TIME_CRITICAL here
SetThreadPriority(t, THREAD_PRIORITY_HIGHEST); // So the priority is no need to raise anymore....(SAD)
}
ThreadPriorityBoostプロパティでも同じです。それは無効にされていません(すでにブーストされています)。
誰かがホストasioデモを作成しようとしましたが、この問題を解決するのに役立ちますか?
ありがとうございます。