【发布时间】:2016-03-08 19:07:02
【问题描述】:
我正在尝试用 C 语言编写一个简单的基于单 AU 播放、(几乎)无延迟的跟踪相位声码器原型。它是一个独立程序。我想知道单个渲染回调可以安全承受多少处理负载,所以我更喜欢不使用异步 DSP。
我的概念是只有一个预先确定的值,即 window step,或 hop size或 抽取因子(不同文献来源中使用的相同术语的不同名称)。这个数字等于inNumberFrames,这在某种程度上取决于设备采样率(还有什么?)。所有其他参数,例如 window size 和 FFT size 将根据窗口步长进行设置。这似乎是 keeipng 在一个回调中的所有内容的最简单方法。
在实际渲染开始之前,即在调用AudioOutputUnitStart() 之前,是否有一种安全的方法可以独立于机器并且安全地猜测或查询inNumberFrames?
相位声码器算法大多是标准的,非常简单,使用 vDSP 函数进行 FFT,加上自定义相位积分,我没有任何问题。
其他调试信息
此代码在输入回调中监控计时:
static Float64 prev_stime; //prev. sample time
static UInt64 prev_htime; //prev. host time
printf("inBus: %d\tframes: %d\tHtime: %lld\tStime: %7.2lf\n",
(unsigned int)inBusNumber,
(unsigned int)inNumberFrames,
inTimeStamp->mHostTime - prev_htime,
inTimeStamp->mSampleTime - prev_stime);
prev_htime = inTimeStamp->mHostTime;
prev_stime = inTimeStamp->mSampleTime;
奇怪的是,参数 inTimeStamp->mSampleTime 实际上显示了渲染帧的数量(参数的名称似乎有些误导)。无论是否在运行时通过 AudioMIDISetup.app 重新设置了另一个采样率,此数字始终为 512,就好像该值已以编程方式硬编码一样。一方面,
inTimeStamp->mHostTime - prev_htime
间隔会根据以数学清晰的方式设置的采样率动态变化。只要采样率值匹配 44100Hz 的倍数,实际渲染就会继续进行。另一方面,48kHz 倍数产生渲染error -10863 ( =
kAudioUnitErr_CannotDoInCurrentContext )。我一定错过了一个非常重要的点。
【问题讨论】:
标签: macos core-audio audiounit