Der Beispielcode zum Erstellen einer Version 3 AudioUnit demonstriert, wie die Implementierung einen Funktionsblock für die Renderverarbeitung zurückgeben muss. Der Block erhält sowohl Proben von der vorhergehenden AxudioUnit in der Kette über und liefert die Ausgangspuffer mit den verarbeiteten Proben. Es muss auch einige Ausgabepuffer bereitstellen, wenn die Einheit in der Kette dies nicht tut. Hier ist ein Auszug von Code aus einer Audio Unit-Unterklasse:Version 3 AudioUnits: Minimum frameCount in internalRenderBlock
- (AUInternalRenderBlock)internalRenderBlock {
/*
Capture in locals to avoid ObjC member lookups.
*/
// Specify captured objects are mutable.
__block FilterDSPKernel *state = &_kernel;
__block BufferedInputBus *input = &_inputBus;
return Block_copy(^AUAudioUnitStatus(
AudioUnitRenderActionFlags *actionFlags,
const AudioTimeStamp *timestamp,
AVAudioFrameCount frameCount,
NSInteger outputBusNumber,
AudioBufferList *outputData,
const AURenderEvent *realtimeEventListHead,
AURenderPullInputBlock pullInputBlock) {
...
});
Das ist in Ordnung, wenn die Verarbeitung erfordert nicht die frameCount
vor dem Aufruf zu diesem Block zu wissen, aber viele Anwendungen erfordern die frameCount
vor diesem Block, um zu wissen, um Speicher zu reservieren, Verarbeitungsparameter vorzubereiten, usw.
Ein Weg um dies zu tun wäre, vorherige Puffer der Ausgabe zu akkumulieren und nur frameCount
Abtastungen jeden Aufruf an den Block auszugeben, aber dies funktioniert nur, wenn mindestens frameCount
bekannt ist. Die Verarbeitung muss mit einer Größe initialisiert werden, die größer als diese Frameanzahl ist, um zu funktionieren. Gibt es eine Möglichkeit, einen Mindestwert für frameCount
anzugeben oder zu erhalten oder einen bestimmten Wert zu erzwingen? https://github.com/WildDylan/appleSample/blob/master/AudioUnitV3ExampleABasicAudioUnitExtensionandHostImplementation/FilterDemoFramework/FilterDemo.mm
Danke, dass Sie mich in die richtige Richtung weisen, aber ich bin auch an OSX interessiert (ich wusste nicht, dass die APIs für die verschiedenen Betriebssysteme so unterschiedlich sind). Irgendeine Idee, wo dies für Anwendungen unter OSX eingestellt werden soll? – mondaugen
Lediglich das hier während ich daran arbeite: es sieht so aus, als könnte AUDeferredRenderer mir helfen. – mondaugen