ASIOCallbacks::bufferSwitchTimeInfo在索尼pa -3上使用DSD格式的2.8MHz采样

ASIOCallbacks::bufferSwitchTimeInfo comes very slowly in 2.8MHz Samplerate with DSD format on Sony PHA-3

本文关键字:格式 DSD 8MHz 采样 bufferSwitchTimeInfo 索尼 pa ASIOCallbacks      更新时间:2023-10-16

我买了一台索尼的pa -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为2822400hz。

和asioDriverInfo。在ASIOCallbacks::bufferSwitchTimeInfo中分配samples,如下所示:

    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属性也是如此。它没有被禁用(已经增强)。

有没有人试着写一个host asio演示来帮我解决这个问题?

问题已解决

我应该在kAsioSetIoFormat之后getBufferSize和createBuffers