6

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


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

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

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

4

1 回答 1

6

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

[viewController performSelectorOnMainThread:@selector(destroyToneUnit) withObject:nil waitUntilDone:NO];
于 2013-05-30T21:07:12.103 回答