2013-01-08 4 views
6

Ich folge dem iOS "Audio Queue Programming Guide - Playing Audio". Nahe dem Ende der Führung gibt es Anrufe an CFRunLoopRunInMode() im Schritt Start and Run an Audio Queue:Warum CFRunLoopRunInMode() im Audio Queue Playback-Code aufrufen?

do {            // 5 
    CFRunLoopRunInMode (       // 6 
     kCFRunLoopDefaultMode,      // 7 
     0.25,          // 8 
     false          // 9 
    ); 
} while (aqData.mIsRunning); 
//... 

Die Dokumentation über die Leitung 6 sagt: „Die CFRunLoopRunInMode Funktion läuft die Laufschleife, die die Audio-Warteschlange des Threads enthält“ Aber wird diese Ausführungsschleife nicht ausgeführt, wenn meine Methode zurückkehrt? Der obige Code wird beim Drücken der Wiedergabetaste in meiner App vom Hauptthread ausgeführt.

Jetzt habe ich eine schwere Zeit zu verstehen, was diese Anrufe an CFRunLoopRunInMode() sind gut für, weil sie den Nachteil haben, dass meine Play-Taste nicht korrekt aktualisiert (es sieht für die ganze Zeit gedrückt, dass die Audiowiedergabe gedrückt) und es gibt keinen positiven Effekt, dh das Audio spielt auch gut, wenn ich die Do-While-Schleife aus meinem Code zusammen mit den Aufrufen zu CFRunLoopRunInMode() entferne und stattdessen direkt von dieser Methode zurückkomme. Nun, dies zeigt auf die offensichtliche Lösung, um diese Anrufe einfach zu entfernen, da dies kein Problem verursacht. Kann jemand erklären, warum dieser Code im offiziellen Leitfaden von Apple zur Verwendung von Audio-Warteschlangen in iOS für die Audiowiedergabe enthalten ist?

Edit:

ich bin nur zu sehen in Mac OS X gibt es die gleichen Audio-Warteschlangen-API wie auf iOS vorhanden ist, und die Leitfaden für iOS scheinen eine Copy-Paste-Duplizierung der Mac OS guide zu sein. Dies führt mich zu dem Verdacht, dass diese Aufrufe der Run-Schleife nur in Mac OS und nicht mehr in iOS, z. weil sonst die Mac OS-Anwendung beendet würde oder so ähnlich. Kann jemand das bitte bestätigen oder es ausschließen?

+2

Ich denke, Sie haben Recht: Für mich sieht das nur aus wie Beispielcode für eine eigenständige (Befehlszeile?) App, die * nichts anderes * als eine Audiodatei zum Abschluss abspielt. In einer "echten" App muss die Ausführungsschleife nicht manuell ausgeführt werden. FWIW, ich benutze AudioQueues und habe diesen Beispielcode nie bemerkt und 'CFRunLoopRunInMode()' niemals in einer solchen Schleife aufgerufen. – bunnyhero

Antwort

1

@bunnyhero ist richtig, CFRunLoopRunInMode() ist in der Regel für Beispiele Befehlszeile

https://github.com/abbood/Learning-Core-Audio-Book-Code-Sample/blob/master/CH05_Player/CH05_Player/main.c

Solange Ihr AudioQueueRef nicht freigegeben ist, müssen Sie nicht CFRunLoopRunInMode() in IOS verwenden ...

Was Ich mache eine separate Klasse für Audio-Warteschlange und solange meine Klasse Zeiger und AudioQueueRef zugeordnet ist, kann ich Wiedergabe, Pause, Fortsetzen, Stop usw. ....