我买了一台索尼 PHA-3 并尝试编写一个应用程序以在本机模式下播放 DSD。(我在 DoP 模式下成功了。)但是,当我将采样率设置为 2.8MHz 时,我发现 ASIOCallbacks::bufferSwitchTimeInfo 的速度并没有达到应有的速度。
请求 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 演示并帮助我解决此问题吗?
首先十分感谢。