2013-05-01 14 views
6

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を殺すのですか? RenderTonedestroyToneUnitが別のスレッドで実行されているため、クリックが発生したと思われます。どのように同期させることができますか?

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

右の前に、右AudioUnitUninitialize(toneUnit);後、通知が表示され、それらの間に私のNSLogメッセージ場合:


場合、それは便利ですが、ここに私のdestroyToneUnitインスタンスメソッドです。

答えて

6

私も同じ問題に遭遇しました。メインスレッドからdestroyToneUnitを呼び出すと、警告が消えてしまいました。

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

ありがとうございます。私はまったく同じ問題を抱えていました。あなたは私の問題を解決しました。 –

関連する問題