Swift 将AVAudioSourceNode连接到AvaudioSiteNode不起作用 上下文
我正在使用AVAudioEngine编写一个信号解释器,它将分析麦克风输入。在开发过程中,我希望使用默认的输入缓冲区,这样我就不必为麦克风制造噪音来测试我的更改。 我正在使用催化剂进行开发 问题 我正在使用以获取声音缓冲区(据称性能比使用Swift 将AVAudioSourceNode连接到AvaudioSiteNode不起作用 上下文,swift,avfoundation,core-audio,Swift,Avfoundation,Core Audio,我正在使用AVAudioEngine编写一个信号解释器,它将分析麦克风输入。在开发过程中,我希望使用默认的输入缓冲区,这样我就不必为麦克风制造噪音来测试我的更改。 我正在使用催化剂进行开发 问题 我正在使用以获取声音缓冲区(据称性能比使用.installTap)要好)。我正在使用(的子类)生成正弦波。当我将这两个节点连接在一起时,我希望能够调用sink节点的回调,但事实并非如此。源节点的渲染块也没有被调用 let engine=AVAudioEngine() 让输出=engine.outputN
.installTap
)要好)。我正在使用(的子类)生成正弦波。当我将这两个节点连接在一起时,我希望能够调用sink节点的回调,但事实并非如此。源节点的渲染块也没有被调用
let engine=AVAudioEngine()
让输出=engine.outputNode
让outputFormat=output.inputFormat(forBus:0)
让sampleRate=Float(outputFormat.sampleRate)
设sineNode440=AVSineWaveSourceNode(
频率:440,
振幅:1,
采样器
)
让sink=avaudiosinode{},frameCount,audioBufferList->OSStatus在
打印(“[SINK]+\(帧数)\(Date().timeIntervalSince1970)”)
返回noErr
}
发动机。连接(sineNode440)
发动机。连接(水槽)
engine.connect(sineNode440,to:sink,格式:nil)
试试引擎启动()
附加测试
如果我将engine.inputNode
连接到接收器(即engine.connect(engine.inputNode,to:sink,format:nil)
),接收器回调将按预期调用
当我将sineNode440
连接到engine.outputNode
时,我可以听到声音,渲染块按预期调用。
因此,当连接到设备输入/输出时,源和接收器都单独工作,而不是一起工作
AVSineWaveSourceNode
对问题不重要,但相关:AVSineWaveSourceNode基于。连接到引擎时,此节点产生正确的声音。outputNode
class-AVSineWaveSourceNode:AVAudioSourceNode{
///我们需要这个单独的类才能在渲染块中注入状态。
阶级国家{
让振幅:浮动
让相位增量:浮动
var相位:浮点=0
初始(频率:浮动,振幅:浮动,取样器:浮动){
自振幅=振幅
相位增量=(2*.pi/采样器)*频率
}
}
让国家:国家
初始(频率:浮动,振幅:浮动,取样器:浮动){
让状态=状态(
频率:频率,,
振幅:振幅,
采样器
)
self.state=状态
let format=AVAudioFormat(带采样率的标准格式:双(采样率),通道:1)!
init(格式:format,renderBlock:{isSilence,},frameCount,audioBufferList->OSStatus in
打印(“[正弦生成\(频率)\(帧数)]”)
设tau=2*Float.pi
让ablPointer=unsafemeutableaudiobufferlistpointer(audioBufferList)
对于0中的帧..=tau{
state.phase-=tau
}
如果state.phase<0.0{
state.phase+=tau
}
//在所有通道上设置相同的值(由于inputFormat,我们只有一个通道)。
用于指针中的缓冲区{
让buf:UnsafeMutableBufferPointer=UnsafeMutableBufferPointer(缓冲区)
buf[帧]=值
}
}
返回noErr
})
对于0中的i.outputNode
在AVAudioEngine
正常配置(“联机”)时驱动音频处理图。outputNode
从其输入节点提取音频,后者从其输入节点提取音频等。当您彼此连接sineNode
和sink
而不连接到outputNode
时,没有任何东西连接到sink
的输出总线或outputNode
的输入总线,因此,当硬件从outputNode
请求音频时,它将无处获取
如果我理解正确,我认为您可以通过摆脱sink
,将sineNode
连接到outputNode
,并在中运行AVAudioEngine
来完成您想要做的事情。在手动渲染模式下,您可以通过手动渲染块来接收音频(类似于avaudiosinode
)并通过调用手动驱动图形。outputNode
在AVAudioEngine
正常配置(“联机”)时驱动音频处理图形。outputNode
从其输入节点提取音频,后者从其输入节点提取音频等。当您彼此连接sineNode
和sink
而不连接到outputNode
时,没有任何东西连接到sink
的输出总线或outputNode
的输入总线,因此,当硬件从outputNode
请求音频时,它将无处获取
如果我理解正确,我认为您可以通过摆脱sink
,将sineNode
连接到outputNode
,并在中运行AVAudioEngine
来完成您想要做的事情。在手动渲染模式下,您可以通过手动渲染块来接收音频(类似于avaudiosinode
)并通过调用手动驱动图形