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.
grazie per il codice. Ho avuto esattamente lo stesso problema. Il codice ha risolto il mio problema. –