我使用基于Matt Gallagher classic example的AudioUnits在iPhone上生成音调。为了避免开头/结尾的唧唧声和点击,我在RenderTone
回调中fading the amplitude in/out。我希望在淡出结束时摧毁ToneUnit,也就是说,在振幅达到零之后。我能想到的唯一方法是在回调中调用实例方法:
if (PlayerState == FADING_OUT) {
amplitude -= stepsize;
if (amplitude <= 0) {
amplitude = 0;
PlayerState = OFF;
[viewController destroyToneUnit];
}
}
不幸的是,我认为这更具挑战性。首先,我仍然得到了fadeout应该消除的最后点击。另一方面,我得到了这个日志通知:
<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;
}
如果我在AudioUnitUninitialize(toneUnit);
之前和之后的NSLog消息,则通知出现在它们之间。
答案 0 :(得分:6)
我也遇到了同样的问题。当我从主线程调用destroyToneUnit时,警告就消失了。
[viewController performSelectorOnMainThread:@selector(destroyToneUnit) withObject:nil waitUntilDone:NO];