iOS: Exemple de code pour l'logging et la lecture simultanés

Je suis en train de concevoir une preuve de concept simple pour un enregistreur multipiste.

Le sharepoint départ évident est de jouer du file A.caf au casque tout en enregistrant simultanément l'input du microphone dans le file B.caf

Cette question – Enregistrer et jouer de l'audio simultanément – souligne qu'il y a trois niveaux auxquels je peux travailler:

  • API AVFoundation (AVAudioPlayer + AVAudioRecorder)
  • API de queue audio
  • API de l'unité audio (RemoteIO)

Quel est le meilleur niveau de travail? Évidemment, la réponse générique est de travailler au plus haut niveau qui fait le travail, ce qui serait AVFoundation.

Mais je prends ce travail de quelqu'un qui a abandonné en raison de problèmes de latence (il obtenait un timeout de 0,3 secondes entre les files), alors peut-être que je dois travailler à un niveau inférieur pour éviter ces problèmes?

En outre, quel code source est disponible pour springboard? J'ai regardé l'exemple SpeakHere ( http://developer.apple.com/library/ios/#samplecode/SpeakHere/Introduction/Intro.html ). si je ne trouve pas quelque chose de plus simple, je vais l'utiliser.

Mais quelqu'un peut-il suggérer quelque chose de plus simple? Je préférerais ne pas travailler avec du code C ++ si je peux l'éviter.

Est-ce que quelqu'un est au courant d'un code public qui utilise AVFoundation pour faire cela?

EDIT: Exemple AVFoundation ici: http://www.iphoneam.com/blog/index.php?title=using-the-iphone-to-record-audio-a-guide&more=1&c=1&tb=1&pb=1

EDIT (2): Beaucoup plus agréable à regarder ici: http://www.switchonthecode.com/tutorials/create-a-basic-iphone-audio-player-with-av-foundation-framework

EDIT (3): Comment save de l'audio sur iPhone avec AVAudioRecorder?

    Pour éviter les problèmes de latence, vous devrez travailler à un niveau inférieur à celui d'AVFoundation. Découvrez cet exemple de code d'Apple – Auriotouch . Il utilise les E / S distantes.

    Comme suggéré par Viraj, voici la réponse.

    Oui, vous pouvez get de très bons résultats avec AVFoundation. Tout d'abord, vous devez faire attention au fait que pour le joueur et l'enregistreur, les activer est un process en deux étapes.

    D'abord, vous l'amorcez.

    Ensuite, vous jouez.

    Alors, tout d'abord. Alors jouez à tout.

    Cela entraînera votre latence à environ 70 ms. J'ai testé en enregistrant une coche de métronome, puis en la lisant à travers les haut-parleurs tout en tenant l'iPhone jusqu'aux haut-parleurs et en enregistrant simultanément.

    Le deuxième logging avait un écho clair, que j'ai trouvé être ~ 70ms. J'aurais pu parsingr le signal dans Audacity pour get un décalage exact.

    Donc, afin de tout aligner, je viens d'effectuerSelector: x avecObject: y afterDelay: 70.0 / 1000.0

    Il peut y avoir des problèmes cachés, par exemple le timeout peut différer d'un périphérique à l'autre. il peut même varier en fonction de l'activité de l'appareil. Il est même possible que le fil puisse être interrompu / replanifié entre le démarrage du lecteur et le démarrage de l'enregistreur.

    Mais cela fonctionne, et est beaucoup plus propre que de déconner avec des files d'attente audio / unités.

    J'ai eu ce problème et je l'ai résolu dans mon projet simplement en changeant le paramètre PreferredHardwareIOBufferDuration de l' AudioSession . Je pense que j'ai juste 6ms de latence maintenant, c'est assez bon pour mon application.

    Cochez cette réponse qui a une bonne explication.