向 AVAudioEngine 添加输入回调
Add input callback to AVAudioEngine
我正在尝试向 AVAudioEngine's
inputNode 添加一个输入回调,但它从未被调用。
希望我可以使用 AVAudioEngine
来管理 iOS 和 OS X 的基本 AUGraph,并且我可以 运行 我自己的代码。我也试过在输入节点上安装一个 tap,但我无法更改缓冲区长度。
我制作了一个单一视图 iOS 应用程序并将此代码放入 viewDidLoad
:
_audioEngine = [AVAudioEngine new];
_inputNode = _audioEngine.inputNode;
_outputNode = _audioEngine.outputNode;
AURenderCallbackStruct inputCallback;
inputCallback.inputProc = inputCalbackProc;
inputCallback.inputProcRefCon = (__bridge void *)(self);
AudioUnitSetProperty(_inputNode.audioUnit,
kAudioOutputUnitProperty_SetInputCallback,
kAudioUnitScope_Global,
0,
&inputCallback,
sizeof(inputCallback));
[_audioEngine startAndReturnError:nil];
渲染回调定义如下:
OSStatus inputCalbackProc (void * inRefCon,
AudioUnitRenderActionFlags * ioActionFlags,
const AudioTimeStamp * inTimeStamp,
UInt32 inBusNumber,
UInt32 inNumberFrames,
AudioBufferList * ioData)
{
printf("Called");
return noErr;
}
我已经设法以相同的方式在输出节点的音频单元上安装了渲染回调,但从未调用过我的输入回调。
我检查过输入节点的音频单元与输出节点的音频单元相同,这表明图表设置正确。我还尝试在 RemoteIO
单元 (inputNode.audioUnit)
上设置 kAudioOutputUnitProperty_EnableIO
有人有什么建议吗?
您能否展示启用 I/O 的代码?请注意,它应该在范围 kAudioUnitScope_Input
和元素 1
.
上
我看到有两件事可能是错误的。你没有提到音频会话。我想知道你是否将它设置为需要输入的东西:
let audioSession = AVAudioSession.sharedInstance()
audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord)
audioSession.setActive(true)
还需要将 kAudioOutputUnitProperty_EnableIO
应用于 kAudioUnitScope_Input
,因为您可以 enable/disable 独立输入或输出。
AudioUnitSetProperty(ioUnit, kAudioOutputUnitProperty_EnableIO,
kAudioUnitScope_Input, bus1, &enableInput,sizeof(enableInput))
还有其他事情要检查,但你说你有一个回调在别处工作,所以这些是特定于这个单元和总线的。
注意:此代码并不完整,只是设置音频会话和启用输入的主要和相关点。
RemoteIO 在准备好呈现时实际上并不提供回调。
由于它与输出是相同的硬件,因此您可以在渲染输出单元时渲染输入单元
我正在尝试向 AVAudioEngine's
inputNode 添加一个输入回调,但它从未被调用。
希望我可以使用 AVAudioEngine
来管理 iOS 和 OS X 的基本 AUGraph,并且我可以 运行 我自己的代码。我也试过在输入节点上安装一个 tap,但我无法更改缓冲区长度。
我制作了一个单一视图 iOS 应用程序并将此代码放入 viewDidLoad
:
_audioEngine = [AVAudioEngine new];
_inputNode = _audioEngine.inputNode;
_outputNode = _audioEngine.outputNode;
AURenderCallbackStruct inputCallback;
inputCallback.inputProc = inputCalbackProc;
inputCallback.inputProcRefCon = (__bridge void *)(self);
AudioUnitSetProperty(_inputNode.audioUnit,
kAudioOutputUnitProperty_SetInputCallback,
kAudioUnitScope_Global,
0,
&inputCallback,
sizeof(inputCallback));
[_audioEngine startAndReturnError:nil];
渲染回调定义如下:
OSStatus inputCalbackProc (void * inRefCon,
AudioUnitRenderActionFlags * ioActionFlags,
const AudioTimeStamp * inTimeStamp,
UInt32 inBusNumber,
UInt32 inNumberFrames,
AudioBufferList * ioData)
{
printf("Called");
return noErr;
}
我已经设法以相同的方式在输出节点的音频单元上安装了渲染回调,但从未调用过我的输入回调。
我检查过输入节点的音频单元与输出节点的音频单元相同,这表明图表设置正确。我还尝试在 RemoteIO
单元 (inputNode.audioUnit)
kAudioOutputUnitProperty_EnableIO
有人有什么建议吗?
您能否展示启用 I/O 的代码?请注意,它应该在范围 kAudioUnitScope_Input
和元素 1
.
我看到有两件事可能是错误的。你没有提到音频会话。我想知道你是否将它设置为需要输入的东西:
let audioSession = AVAudioSession.sharedInstance()
audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord)
audioSession.setActive(true)
还需要将 kAudioOutputUnitProperty_EnableIO
应用于 kAudioUnitScope_Input
,因为您可以 enable/disable 独立输入或输出。
AudioUnitSetProperty(ioUnit, kAudioOutputUnitProperty_EnableIO,
kAudioUnitScope_Input, bus1, &enableInput,sizeof(enableInput))
还有其他事情要检查,但你说你有一个回调在别处工作,所以这些是特定于这个单元和总线的。
注意:此代码并不完整,只是设置音频会话和启用输入的主要和相关点。
RemoteIO 在准备好呈现时实际上并不提供回调。 由于它与输出是相同的硬件,因此您可以在渲染输出单元时渲染输入单元