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.