ios objective-c xcode audio audioqueueservices

ios - AudioQueueDispose delay



objective-c xcode (1)

De acuerdo con la documentación aquí https://developer.apple.com/library/mac/documentation/MusicAudio/Reference/AudioQueueReference/#//apple_ref/c/func/AudioQueueDispose

err = AudioQueueDispose(queue, true);

Utilizo true para deshacerme de AudioQueue produce de inmediato, aunque se AudioQueue inmediato la cola a veces, otras veces demora entre 3 y 4 segundos hasta 13 segundos en el dispositivo. err = AudioQueueStop(queue, true) tiene el mismo problema.

Según tengo entendido, ambas funciones intentan descargar y liberar búferes ya a punto de enrutar ...
así que incluso ayudo a mi función de devolución de llamada a vaciar los búferes si se va a llamar a AudioQueueDispose .

static void MyAQOutputCallBack(void *inUserData, AudioQueueRef inAQ, AudioQueueBufferRef inCompleteAQBuffer) { if (player.shouldDispose) { printf("player shouldDispose !!!!!!!!!!!/n/n/n/n/n/n"); OSStatus dispose = AudioQueueFlush (inAQ); return; } }

Como voy a grabar algo usando AudioQueues después de reproducir una pista, necesito que estas funciones se devuelvan sin demoras. ¿Doscientos milisegundos está bien, pero 3-4 segundos? eso es inaceptable

Otras funciones de AudioQueue también son llamadas en el mismo hilo y parecen funcionar bien.

También he intentado llamar esto al hilo principal para asegurarme de que va a cambiar algo o no.

[self performSelectorOnMainThread:@selector(tryOnMain) withObject:nil waitUntilDone:NO];

o

dispatch_sync(dispatch_get_main_queue(),^{ no hizo ninguna diferencia

¿Alguna idea de lo que podría estar pasando?


Con éxito, detengo de inmediato mi reproducción de audio de la siguiente manera:

-(void)stopAudio { @synchronized(audioLock) { audioLock=[NSNumber numberWithBool:false]; OSStatus err; err=AudioQueueReset (_audioQueue); if (err != noErr) { NSLog(@"AudioQueueReset() error: %d", (int)err); } err=AudioQueueStop (_audioQueue, YES); if (err != noErr) { NSLog(@"AudioQueueStop() error: %d", (int)err); } err=AudioQueueDispose (_audioQueue, YES); if (err != noErr) { NSLog(@"AudioQueueDispose() error: %d", (int)err); } } }

Y en mi:

void audioCallback(void *custom_data, AudioQueueRef queue, AudioQueueBufferRef buffer)

Solo pongo más cosas en mi cola si:

myObject *weakSelf = (__bridge myObject *)custom_data; @synchronized(weakSelf -> audioLock) { if ([weakSelf -> audioLock boolValue]) { Put_more_stuff_on_queue }

En mi caso particular, reproduzco audio AAC-LC.