ASIOCallbacks::bufferSwitchTimeInfo在索尼pa -3上使用DSD格式的2.8MHz采样
ASIOCallbacks::bufferSwitchTimeInfo comes very slowly in 2.8MHz Samplerate with DSD format on Sony PHA-3
我买了一台索尼的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
- 如何在openssl-ecc中获取十六进制格式的私钥
- 将"打开的CV图像"中的"颜色"转换为整数格式
- TDateTime格式在C++Builder中不会更改
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 检查不带转换的扫描格式
- 当我尝试使用 sstream 和分面将 Boost Time_duration转换为字符串时,我没有得到所需的格式
- 是否可以从格式字符串中检索"width"
- clang格式:宏的缩进
- clang格式:禁用排序包含
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 将RGB图像保存为PPM格式
- 询问在设计我的手臂模拟器功能表示格式1
- 当使用比格式支持的精度更高的精度来显示数字时,会写出什么数据
- 带有Protobuf序列化的C++Hazelcast:字符串不是UTF-8格式的
- 如何将strftime中的格式错误作为异常捕获
- 将CHW格式的浮点向量转换为cv::Mat
- 如何将二进制格式的 C++ 对象的 std::vector 保存到磁盘?
- 如何以叮当格式设置评论的行长?
- 为什么我需要C++中不同的排序格式来对这个USACO代码上的数组和优先级队列进行排序
- ASIOCallbacks::bufferSwitchTimeInfo在索尼pa -3上使用DSD格式的2.8MHz采样