1

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

首先十分感谢。

4

1 回答 1

0

问题已清除。

我应该在 kAsioSetIoFormat 之后 getBufferSize 和 createBuffers。

于 2016-09-24T08:25:59.100 回答