我正在使用基于 Matt Gallagher 的经典示例的 AudioUnits 在 iPhone 上生成音调。为了避免开始/结束时的啁啾声和咔嗒声,我在回调中淡入/淡出幅度。RenderTone
我想在淡出结束时破坏 ToneUnit,也就是在幅度达到零之后。我能想到的唯一方法是从回调中调用实例方法:
if (PlayerState == FADING_OUT) {
amplitude -= stepsize;
if (amplitude <= 0) {
amplitude = 0;
PlayerState = OFF;
[viewController destroyToneUnit];
}
}
不幸的是,这比我想象的更具挑战性。一方面,我仍然会在结束时听到淡出应该消除的咔嗒声。另一方面,我收到此日志通知:
<AURemoteIO::IOThread> Someone is deleting an AudioConverter while it is in use.
此消息是什么意思,为什么我会收到它?
我应该如何杀死 ToneUnit?我怀疑点击发生是因为RenderTone
并destroyToneUnit
在不同的线程上运行。我怎样才能让这些同步?
如果它有帮助,这是我的destroyToneUnit
实例方法:
- (void) destroyToneUnit {
AudioOutputUnitStop(toneUnit);
AudioUnitUninitialize(toneUnit);
AudioComponentInstanceDispose(toneUnit);
toneUnit = nil;
}
如果我在 NSLog 之前和之后AudioUnitUninitialize(toneUnit);
的消息,通知会出现在它们之间。