2013-01-08 8 views
6

Sto seguendo la "Guida alla programmazione della coda audio iOS - Riproduzione audio". Verso la fine della guida, ci sono chiamate a CFRunLoopRunInMode() nella fase Start and Run an Audio Queue:Perché chiamare CFRunLoopRunInMode() nel codice di riproduzione della coda audio?

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

La documentazione sulla linea 6 dice: "La funzione CFRunLoopRunInMode corre il ciclo di esecuzione che contenga filo della coda audio" Ma il ciclo di esecuzione non è eseguito comunque quando il mio metodo ritorna? Il codice sopra viene eseguito dal thread principale quando si preme il pulsante di riproduzione nella mia app.

Ora ho difficoltà a capire a cosa servono queste chiamate a CFRunLoopRunInMode(), perché hanno lo svantaggio che il mio pulsante di riproduzione non si aggiorna correttamente (sembra premuto per tutto il tempo in cui l'audio viene riprodotto) e non c'è alcun effetto positivo, cioè l'audio funziona bene anche se rimuovo il do-while-loop dal mio codice insieme alle chiamate a CFRunLoopRunInMode() e invece direttamente ritorna da questo metodo. Bene, questo indica la soluzione ovvia per mantenere semplicemente queste chiamate rimosse in quanto ciò non crea problemi. Qualcuno può spiegare perché allora questo codice è incluso nella guida ufficiale di Apple sull'utilizzo delle code audio in iOS per la riproduzione audio?

Edit:

sto solo vedendo che in Mac OS X, esiste la stessa API code audio come su iOS, e la guida per iOS sembra essere una duplicazione copia-incolla del Mac OS guide. Ciò mi porta a sospettare che quelle chiamate al ciclo di esecuzione siano richieste solo in Mac OS e non più in iOS, ad es. perché altrimenti l'applicazione Mac OS sarebbe uscita o qualcosa del genere. Qualcuno può verificare questo o escluderlo?

+2

Penso che tu abbia ragione: per me, sembra proprio un codice di esempio per un'app standalone (da riga di comando?) Che * nient'altro * ma riproduce un file audio fino al completamento. In un'app "reale", non è necessario eseguire il ciclo di esecuzione "manualmente". FWIW, uso AudioQueues e non ho mai notato quel codice di esempio, e non ho mai chiamato 'CFRunLoopRunInMode()' in un ciclo simile. – bunnyhero

risposta

1

@bunnyhero è giusto, CFRunLoopRunInMode() è di solito per gli esempi della riga di comando

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

Finché il AudioQueueRef non viene deallocato, non dovete utilizzare CFRunLoopRunInMode() in IOS ...

Cosa Faccio è creare una classe separata per la coda audio e fino a quando il mio puntatore di classe e AudioQueueRef è allocato Posso riprodurre, mettere in pausa, riprendere, interrompere, ecc ....

Problemi correlati