【问题标题】:ASIOCallbacks::bufferSwitchTimeInfo comes very slowly in 2.8MHz Samplerate with DSD format on Sony PHA-3ASIOCallbacks::bufferSwitchTimeInfo 在 Sony PHA-3 上以 2.8MHz 采样率和 DSD 格式出现非常缓慢
【发布时间】:2018-10-24 17:58:02
【问题描述】:

我买了一台索尼​​ 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 演示并帮助我解决此问题吗?

非常感谢。

【问题讨论】:

    标签: c++ native asio


    【解决方案1】:

    问题已解决。

    我应该在 kAsioSetIoFormat 之后 getBufferSize 和 createBuffers。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多