2013-05-01 11 views
6

Ich erzeuge Töne auf dem iPhone mit AudioUnits basierend auf classic example von Matt Gallagher. Um die Chirps und Klicks am Anfang/Ende zu vermeiden, bin ich fading the amplitude in/out im RenderTone Callback. Ich möchte die ToneUnit am Ende des Ausblendens zerstören, das heißt, nachdem die Amplitude Null erreicht hat. Die einzige Möglichkeit, die ich denken kann, dies zu tun ist eine Instanz-Methode aufrufen, innerhalb der Callback:Wie wird ToneUnit nach dem Ausblenden des Tons korrekt zerstört?

if (PlayerState == FADING_OUT) { 
     amplitude -= stepsize; 
     if (amplitude <= 0) { 
      amplitude = 0; 
      PlayerState = OFF; 
      [viewController destroyToneUnit]; 
     } 
    } 

Leider ist dieses schwieriger ist, dass ich gedacht hatte. Zum einen bekomme ich am Ende immer noch den Klick, den das Ausblenden eigentlich hätte eliminieren sollen. Zum anderen bekomme ich dieses Protokoll Hinweis:

Was bedeutet diese Nachricht und warum bekomme ich es?

Wie sollte Ich töte die ToneUnit? Ich vermute, dass der Klick auftritt, weil RenderTone und destroyToneUnit auf verschiedenen Threads ausgeführt werden. Wie kann ich diese synchronisieren?


Im Fall ist es hilfreich, hier ist meine destroyToneUnit Instanzmethode:

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

Wenn ich NSLog Nachrichten direkt vor und direkt nach AudioUnitUninitialize(toneUnit);, die Mitteilung zwischen ihnen erscheint.

Antwort

6

Ich lief auch in das gleiche Problem. Als ich die destroyToneUnit vom Hauptthread aus anrief, ging die Warnung weg.

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

danke für dich code. Ich hatte genau das gleiche Problem. Du hast mein Problem gelöst. –