2013-05-01 16 views
6

Sto generando toni su iPhone utilizzando AudioUnits basato su classic example di Matt Gallagher. Al fine di evitare i trilli e i clic all'inizio/alla fine, sono fading the amplitude in/out nella richiamata RenderTone. Mi piacerebbe distruggere il ToneUnit alla fine della dissolvenza, cioè dopo che l'ampiezza raggiunge lo zero. L'unico modo che posso pensare di fare questo è quello di chiamare un metodo di istanza all'interno del callback:Come distruggere correttamente ToneUnit dopo la dissolvenza del tono?

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

Purtroppo questo è più difficile che io avevo pensato. Per prima cosa, ottengo ancora il clic alla fine che la dissolvenza doveva eliminare. Per un altro, ottengo questo avviso di registro:

<AURemoteIO::IOThread> Someone is deleting an AudioConverter while it is in use. 

Che cosa significa questo messaggio e perché lo ottengo?

Come deve Ho ucciso il ToneUnit? Sospetto che il clic si verifichi perché RenderTone e destroyToneUnit vengono eseguiti su thread diversi. Come posso ottenere questi sincronizzati?


Nel caso in cui è utile, ecco il mio metodo destroyToneUnit esempio:

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

Se i messaggi sono NSLog destra prima e subito dopo AudioUnitUninitialize(toneUnit);, l'avviso appare tra di loro.

risposta

6

Ho riscontrato anche lo stesso problema. Quando ho chiamato destroyToneUnit dal thread principale, l'avviso è andato via.

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

grazie per il codice. Ho avuto esattamente lo stesso problema. Il codice ha risolto il mio problema. –

Problemi correlati