2017-08-11 1 views
3

Ich habe eine Frage zu CoreAudio und AVFoundation.Leistung zwischen CoreAudio und AVFoundation

Ich habe eine Pro-Audio-Anwendung mit CoreAudio mit einem AUGraph und AudioUnit gebaut.

Ich würde gerne zu AVFoundation Framework wechseln, das wirklich toll zu sein scheint. Aber da ich mir Sorgen um die Leistung mache, würde ich gerne ein bisschen mehr darüber wissen.

In meinem Kern-Audio-Render-Callback kann ich 512 Samples mit einer Samplerate von 44100 kHz verarbeiten, so dass mein Callback alle 10ms aufgerufen wird, und ich denke, dass es schneller gehen könnte (habe ich Recht?).

Jetzt in AVFoundation ist der Render-Callback der Tap des AVAudioNode. Und ich habe in dem Kommentar gelesen, dass der Parameter pufferSize the requested size of the incoming buffers in sample frames. Supported range is [100, 400] ms. ist Also bedeutet es, dass ich weniger als 4410 Proben bei jedem Aufruf verarbeiten kann?

Kommt die Einschränkung von den Objective-C-Einschränkungen (Nachrichtenaufrufe, Sperren usw.)?

Wird es sich nicht auf den Echtzeit-DSP-Prozess auswirken?

Antwort

4

In meinen Experimenten mit der iOS AVAudioEngine API (iOS 10.3.3) fand ich tatsächlich, dass die Installation eines Tap auf einem AVAudioNode-Bus keine Puffer kürzer als 4410 Samples auf meinem iPhone 7 liefert. Dies könnte daran liegen, dass ein AVAudioEngine tappt liefert Puffer an einen Thread mit niedrigerer Priorität als CoreAudio-Audio-Unit-Callbacks und kann daher nicht so oft zuverlässig abgerufen werden, was zu einer höheren Latenz führt.

Allerdings kann man eine V3 AUAudioUnit-Unterklasse mit den von der Instanz internalRenderBlock für die Ausgabe empfangenen Puffern von 512 bis zu 64 Samples auf einem iPhone 7 erstellen. Calling setPreferredIOBufferDuration für die Audiositzung scheint gesetzt zu sein die bevorzugte AUAudioUnit Render-Blockpuffergröße. Ich habe einen Teil meines Testcodes geposted (gemischt mit Swift 3 und Objective C), um etwas zu erschaffen, was meiner Meinung nach eine V3 AUAudioUnit-Tongenerator-Unterklasse mit niedriger Latenz ist. Man muss Echtzeitcodierungseinschränkungen (keine Methodenaufrufe, Sperren, Speicherzuweisungen usw.) innerhalb des Renderblocks verstehen und befolgen, so dass einfaches C für den Audiokontextcode innerhalb des Blocks am besten erscheint (vielleicht sogar obligatorisch).

Für Mikrofoneingänge mit geringer Latenz mit gleich kurzen Puffern können Sie versuchen, Ihre Audioeinheit-Unterklasse mit dem InputNode der audioEngine zu verbinden und dann den AURenderPullInputBlock des Eingangs in Ihrem Einheiten-Renderblock aufzurufen.

+0

Vielen Dank @ hotpaw2! Ich schätze immer Ihre Qualitätsantworten hier. Das ist, was ich suchte, und es scheint eine gute Lösung zu sein. Ich habe AUAudioUnit nicht unterklassifiziert. Übrigens ist es so traurig, dass wir das Audiogerät nicht von einem AVAudioPlayer bekommen konnten ... Wenn ich also gut verstehe, wäre der richtige Weg, um das Sample eines AVAudioPlayerNode mit hoher Rate zu bekommen/zu ändern: AVAudioPlayerNode -> MyCustomAU (mit Callback) -> OtherAVAudioUnit. In der Tat scheint es, dass es möglich wäre, die AudioUnit nur mit macOS 10.13 und höher zu bekommen. – DEADBEEF

+0

Quelle meines letzten Kommentars [Apple Documentation] (https://developer.apple.com/documentation/avfoundation/avaudionode/2866396-auaudiounit) – DEADBEEF

+0

Eine AUAudioUnit-Unterklasse scheint für Code zu funktionieren, der im iOS-Simulator läuft, der unter macOS 10.12 läuft. Raten Sie, was das bedeuten könnte ... – hotpaw2

Verwandte Themen