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

Joh*_*hnK 6 iphone synchronization core-audio audio-converter remoteio

我使用基于Matt Gallagher 经典示例的 AudioUnits在iPhone上生成音调.为了避免开始/结束时的唧唧声和咔嗒声,我在回调中淡入/淡出幅度RenderTone.我希望在淡出结束时摧毁ToneUnit,也就是说,在振幅达到零之后.我能想到的唯一方法就是从回调中调用实例方法:

    if (PlayerState == FADING_OUT) {
        amplitude -= stepsize;
        if (amplitude <= 0) {
            amplitude = 0;
            PlayerState = OFF;
            [viewController destroyToneUnit];
        }
    }
Run Code Online (Sandbox Code Playgroud)

不幸的是,这比我想象的更具挑战性.首先,我仍然得到了fadeout应该消除的最后点击.另一方面,我收到此日志通知:

<AURemoteIO::IOThread> Someone is deleting an AudioConverter while it is in use.
Run Code Online (Sandbox Code Playgroud)

这条消息意味着什么,为什么我得到它?

如何应我杀ToneUnit?我怀疑发生了点击,因为RenderTone它destroyToneUnit在不同的线程上运行.如何让这些同步?


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

- (void) destroyToneUnit {
    AudioOutputUnitStop(toneUnit);
    AudioUnitUninitialize(toneUnit);
    AudioComponentInstanceDispose(toneUnit);
    toneUnit = nil;
}
Run Code Online (Sandbox Code Playgroud)

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

ssk*_*ssk 6

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

[viewController performSelectorOnMainThread:@selector(destroyToneUnit) withObject:nil waitUntilDone:NO];
Run Code Online (Sandbox Code Playgroud)