2015-07-17 10 views
26

Secondo la documentazione qui https://developer.apple.com/library/mac/documentation/MusicAudio/Reference/AudioQueueReference/#//apple_ref/c/func/AudioQueueDisposeAudioQueueDispose ritardo

err = AudioQueueDispose(queue, true); 

uso true così smaltire AudioQueue avviene immediatamente, anche se ci vuole disporre coda immediatamente a volte, altre volte con un ritardo di 3-4 secondi fino a 13 secondi sul dispositivo. err = AudioQueueStop(queue, true) ha lo stesso problema.

mia comprensione è che entrambe le funzioni tentano di irrigare a rilascio già buffer e in procinto di essere accodati ...
così ho anche aiutare la mia funzione di richiamata per svuotare i buffer se AudioQueueDispose sta per essere chiamato.

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; 
    } 
} 

Dal momento che sto andando a registrare qualcosa con AudioQueues dopo la riproduzione di un brano, ho bisogno di questo funzioni restituiti senza ritardi. qualche centinaio di millisecondi va bene, ma 3-4 secondi? è inaccettabile.

Altre funzioni AudioQueue vengono anche chiamate sullo stesso thread e sembrano funzionare correttamente.

Ho anche provato a chiamare questo sul thread principale per assicurarsi che se si sta per cambiare qualcosa o no

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

o

dispatch_sync(dispatch_get_main_queue(),^{ fatto fare alcuna differenza

Qualsiasi idea cosa potrebbe accadere?

+0

hai provato diversi codec audio? Ho visto cose strane accadendo quando si utilizzavano alcuni dei codec. Consiglierei Apple Lossless solo perché è Apple :) – Jaro

risposta

1

ho con successo fermare subito la mia riproduzione audio:

-(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); 
      } 
     } 
    } 

E nella mia:

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

Ho solo messo più roba nella mia coda se:

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

Nella mia Caso particolare Riproduco l'audio AAC-LC.