ASIOCallbacks :: bufferSwitchTimeInfo在Sony PHA-3上采用DSD格式的2.8MHz采样速率非常慢

时间:2016-09-23 15:25:57

标签: c++ native asio

我买了一台索尼​​PHA-3并尝试编写一个应用程序,以原生模式播放DSD。 (我在DoP模式下成功了。) 但是,当我将samplerate设置为2.8MHz时,我发现ASIOCallbacks :: bufferSwitchTimeInfo的速度并不快。

需要将近8秒的时间来请求2.8MHz样本,这些样本应在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演示并帮我解决这个问题吗?

非常感谢。

1 个答案:

答案 0 :(得分:0)

问题已清除。

我应该在kAsioSetIoFormat之后获取BusuffSize和createBuffers。