Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 将AVAudioSourceNode连接到AvaudioSiteNode不起作用 上下文_Swift_Avfoundation_Core Audio - Fatal编程技术网

Swift 将AVAudioSourceNode连接到AvaudioSiteNode不起作用 上下文

Swift 将AVAudioSourceNode连接到AvaudioSiteNode不起作用 上下文,swift,avfoundation,core-audio,Swift,Avfoundation,Core Audio,我正在使用AVAudioEngine编写一个信号解释器,它将分析麦克风输入。在开发过程中,我希望使用默认的输入缓冲区,这样我就不必为麦克风制造噪音来测试我的更改。 我正在使用催化剂进行开发 问题 我正在使用以获取声音缓冲区(据称性能比使用.installTap)要好)。我正在使用(的子类)生成正弦波。当我将这两个节点连接在一起时,我希望能够调用sink节点的回调,但事实并非如此。源节点的渲染块也没有被调用 let engine=AVAudioEngine() 让输出=engine.outputN

我正在使用AVAudioEngine编写一个信号解释器,它将分析麦克风输入。在开发过程中,我希望使用默认的输入缓冲区,这样我就不必为麦克风制造噪音来测试我的更改。 我正在使用催化剂进行开发

问题 我正在使用以获取声音缓冲区(据称性能比使用
.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
)并通过调用手动驱动图形