【发布时间】:2017-12-28 14:29:29
【问题描述】:
我有一个 AUGraph 设置,其中有几个 File Player 音频单元馈入 MultiChannelMixer 单元,然后馈入 Remote I/O 输出。这个设置工作得很好。
现在我一直在努力添加回调,以便我可以计算各个文件播放器的声音级别。
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 ...
}
AUTrack simple 保存有关该特定轨道的信息。将整个类实例传递给回调(通常在示例中这样做)在这里没有意义,因为有多个文件播放器。
现在我需要在某个地方设置这个回调,这样我就可以从每个输入混音器的文件播放器中捕获值。然而,当我尝试这样做时,我不断收到 -10877(无效元素)错误。
我尝试用这个设置计量回调。
// 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))
我不太确定如何解决这个问题。
除非我以某种方式将它们传回混音器单元,否则这个回调不会“吃掉”样本吗?
【问题讨论】:
标签: swift swift3 callback core-audio audiounit