音调淡出后如何正确销毁ToneUnit?

时间:2013-05-01 21:04:01

标签: iphone synchronization core-audio remoteio audio-converter

我使用基于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?我怀疑发生了点击,因为RenderTonedestroyToneUnit在不同的线程上运行。我怎样才能使这些同步?


如果它有用,这是我的destroyToneUnit实例方法:

- (void) destroyToneUnit {
    AudioOutputUnitStop(toneUnit);
    AudioUnitUninitialize(toneUnit);
    AudioComponentInstanceDispose(toneUnit);
    toneUnit = nil;
}

如果我在AudioUnitUninitialize(toneUnit);之前和之后的NSLog消息,则通知出现在它们之间。

1 个答案:

答案 0 :(得分:6)

我也遇到了同样的问题。当我从主线程调用destroyToneUnit时,警告就消失了。

[viewController performSelectorOnMainThread:@selector(destroyToneUnit) withObject:nil waitUntilDone:NO];