2017-08-01 5 views
0

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

Antwort

0

Unter iOS, eine Audioeinheit Rückruf Variable frameCounts Lage sein müssen, zu handhaben:

Der Beispielcode aus genommen wird. Sie können es nicht zwingen, eine Konstante zu sein.

Jede Verarbeitung, die einen Puffer fester Größe erfordert, sollte daher außerhalb des Rückrufs der Audiogeräte erfolgen. Sie können Daten an einen Verarbeitungsthread übergeben, indem Sie einen blockierungsfreien Ringpuffer/Fifo oder eine ähnliche Struktur verwenden, für die im Rückruf keine Speicherverwaltung erforderlich ist.

Sie können vorschlagen, dass frameCount eine bestimmte Größe hat, indem Sie eine Pufferdauer mit den AVAudioSession-APIs festlegen. Das Betriebssystem kann dies jedoch ignorieren, abhängig von anderen Audioanforderungen im System (Energiesparmodi, Systemsounds, usw.). Meiner Erfahrung nach wird der Audiotreiber nur die vorgeschlagene Größe erhöhen, nicht verringern (um mehr als a Paar Samples wenn Resampling auf keine Potenz von 2).

+0

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

+0

Lediglich das hier während ich daran arbeite: es sieht so aus, als könnte AUDeferredRenderer mir helfen. – mondaugen