Ich habe ein AUGraph-Setup mit ein paar File Player-Audiogeräten, die in eine MultichannelMixer-Einheit gespeist werden, die dann in einen Remote I/O-Ausgang eingespeist wird. Dieses Setup hat gut funktioniert.Core Audio-Soundmessung für mehrere Dateiplayer
Jetzt habe ich gekämpft, um einen Rückruf so hinzufügen, dass ich den Geräuschpegel der einzelnen Datei-Player berechnen kann.
private let meteringCallback: AURenderCallback = { (
inRefCon,
ioActionFlags,
inTimeStamp,
inBusNumber,
frameCount,
ioData) -> OSStatus in
var status = noErr
var track: AUTrack = unsafeBitCast(inRefCon, to: AUTrack.self)
status = AudioUnitRender(track.fileAU!,
ioActionFlags,
inTimeStamp,
inBusNumber,
frameCount,
ioData!);
var samples = [Float]()
let ptr = ioData!.pointee.mBuffers.mData?.assumingMemoryBound(to: Float.self)
samples.append(contentsOf: UnsafeBufferPointer(start: ptr, count: Int(frameCount)))
// ... fancy algorithm calculating DB value ...
}
AIRrack simple enthält Informationen zu diesem bestimmten Track. Die Übergabe der gesamten Klasseninstanz an den Rückruf (wie in den Beispielen üblich) ist hier nicht sinnvoll, da mehrere Dateiplayer vorhanden sind.
Jetzt muss ich diesen Callback irgendwo einstellen, damit ich den Wert von jedem der Dateiplayer erfassen kann, die in den Mixer eingespeist werden. Trotzdem bekomme ich immer einen Fehler von -10877 (ungültiges Element), wenn ich das versuche.
Ich versuche, die Messung Callback mit diesem einzurichten.
// Set metering callback
var meteringCallbackStruct = AURenderCallbackStruct(inputProc: meteringCallback,
inputProcRefCon: &self.tracks[1])
status = AudioUnitSetProperty(self.tracks[1].fileAU!,
kAudioUnitProperty_SetRenderCallback,
kAudioUnitScope_Output,
0,
&meteringCallbackStruct,
UInt32(MemoryLayout<AURenderCallbackStruct>.size))
Ich bin nicht ganz sicher, wie man das löst.
Und würde dieser Callback die Samples nicht "essen", wenn ich sie nicht irgendwie an die Mixereinheit zurückgebe?
Vielen Dank. Das ist eine große Hilfe für mich, ich war schon halb dabei meinen eigenen Mixer zu schreiben. Ich kann nicht glauben, dass ich diese Parameter in den Header-Dateien verpasst habe. : D –