Matt Gallagherのclassic exampleに基づくAudioUnitsを使用してiPhoneでトーンを生成しています。最初/最後にチャープやクリックを避けるため、私はRenderTone
コールバックでfading the amplitude in/outです。私はフェードアウトの終わりに、すなわち振幅がゼロになった後にToneUnitを破壊したいと思います。私はこれを行うに考えることができる唯一の方法は、コールバック内からインスタンスメソッドを呼び出すことです:トーンがフェードアウトした後にToneUnitを正しく破棄する方法?
if (PlayerState == FADING_OUT) {
amplitude -= stepsize;
if (amplitude <= 0) {
amplitude = 0;
PlayerState = OFF;
[viewController destroyToneUnit];
}
}
は、残念ながら、これは私が考えていたことがより困難です。 1つのこととして、フェードアウトが取り除かなければならない最後のクリックをまだ得ています。別の場合は、このログの通知を受け取ります:
<AURemoteIO::IOThread> Someone is deleting an AudioConverter while it is in use.
このメッセージは何を意味し、なぜ私はそれを取得しますか?
どのようにする必要があります私はToneUnitを殺すのですか? RenderTone
とdestroyToneUnit
が別のスレッドで実行されているため、クリックが発生したと思われます。どのように同期させることができますか?
- (void) destroyToneUnit {
AudioOutputUnitStop(toneUnit);
AudioUnitUninitialize(toneUnit);
AudioComponentInstanceDispose(toneUnit);
toneUnit = nil;
}
右の前に、右AudioUnitUninitialize(toneUnit);
後、通知が表示され、それらの間に私のNSLogメッセージ場合:
場合、それは便利ですが、ここに私のdestroyToneUnit
インスタンスメソッドです。
ありがとうございます。私はまったく同じ問題を抱えていました。あなたは私の問題を解決しました。 –