2015-07-17 10 views
26

Laut Dokumentation hier https://developer.apple.com/library/mac/documentation/MusicAudio/Reference/AudioQueueReference/#//apple_ref/c/func/AudioQueueDisposeAudioQueueDispose Verzögerung

err = AudioQueueDispose(queue, true); 

I true verwenden, so von AudioQueue entsorgen geschieht sofort, obwohl es Warteschlange funktioniert sofort entsorgen manchmal, ein anderes Mal hat Verzögerung 3-4 Sekunden bis zu 13 Sekunden auf die Gerät. err = AudioQueueStop(queue, true) hat das gleiche Problem.

Mein Verständnis ist, dass beide Funktionen versuchen bereits zu spülen Release Puffer und über die Warteschlange eingereiht werden ...
so auch ich meine Call-Back-Funktion helfen, die Puffer, wenn AudioQueueDispose wird genannt werden zu spülen.

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

Da ich etwas aufnehmen werde mit AudioQueues nach Wiedergabe eines Titels, muss ich diese Funktionen ohne Verzögerungen zurückgegeben. ein paar hundert Millisekunden ist in Ordnung, aber 3-4 Sekunden? das ist inakzeptabel.

Andere AudioQueue Funktionen werden auch auf dem gleichen Thread aufgerufen und sie scheinen gut zu funktionieren.

ich auch diese sicher zu machen auf Hauptthread zu nennen versucht haben, wenn es etwas oder nicht

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

oder

dispatch_sync(dispatch_get_main_queue(),^{ nur knapp sein Ziel macht einen Unterschied

ändern wird Alle Idee was könnte passieren?

+0

haben Sie verschiedene Audiocodecs ausprobiert? Ich habe seltsame Dinge erlebt, wenn ich einige der Codecs benutzt habe. Ich würde Apple Lossless nur empfehlen, weil es Apple ist :) – Jaro

Antwort

1

ich sofort erfolgreich meine Audio-Wiedergabe stoppen, indem:

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

Und in meinem:

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

ich nur mehr Sachen in meiner Warteschlange gestellt, wenn:

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

In meinem Insbesondere spiele ich AAC-LC Audio.