Objective c 为CoreAudio设置效果音频单元
我正在尝试设置高通滤波器,但当我尝试时,AUGraphStart给了我-10863。我根本找不到什么文件。这是我设置过滤器的注意事项:Objective c 为CoreAudio设置效果音频单元,objective-c,ios,core-audio,audiounit,Objective C,Ios,Core Audio,Audiounit,我正在尝试设置高通滤波器,但当我尝试时,AUGraphStart给了我-10863。我根本找不到什么文件。这是我设置过滤器的注意事项: - (void)initializeAUGraph{ AUNode outputNode; AUNode mixerNode; AUNode effectNode; NewAUGraph(&mGraph); // Create AudioComponentDescriptions for the AUs we w
- (void)initializeAUGraph{
AUNode outputNode;
AUNode mixerNode;
AUNode effectNode;
NewAUGraph(&mGraph);
// Create AudioComponentDescriptions for the AUs we want in the graph
// mixer component
AudioComponentDescription mixer_desc;
mixer_desc.componentType = kAudioUnitType_Mixer;
mixer_desc.componentSubType = kAudioUnitSubType_AU3DMixerEmbedded;
mixer_desc.componentFlags = 0;
mixer_desc.componentFlagsMask = 0;
mixer_desc.componentManufacturer = kAudioUnitManufacturer_Apple;
// output component
AudioComponentDescription output_desc;
output_desc.componentType = kAudioUnitType_Output;
output_desc.componentSubType = kAudioUnitSubType_RemoteIO;
output_desc.componentFlags = 0;
output_desc.componentFlagsMask = 0;
output_desc.componentManufacturer = kAudioUnitManufacturer_Apple;
//effect component
AudioComponentDescription effect_desc;
effect_desc.componentType = kAudioUnitType_Effect;
effect_desc.componentSubType = kAudioUnitSubType_HighPassFilter;
effect_desc.componentFlags = 0;
effect_desc.componentFlagsMask = 0;
effect_desc.componentManufacturer = kAudioUnitManufacturer_Apple;
// Add nodes to the graph to hold our AudioUnits
AUGraphAddNode(mGraph, &output_desc, &outputNode);
AUGraphAddNode(mGraph, &mixer_desc, &mixerNode);
AUGraphAddNode(mGraph, &effect_desc, &effectNode);
// Connect the nodes
AUGraphConnectNodeInput(mGraph, mixerNode, 0, effectNode, 0);
AUGraphConnectNodeInput(mGraph, effectNode, 0, outputNode, 0);
//Open Graph
AUGraphOpen(mGraph);
// Get a link to the mixer AU
AUGraphNodeInfo(mGraph, mixerNode, NULL, &mMixer);
// Get a link to the effect AU
AUGraphNodeInfo(mGraph, effectNode, NULL, &mEffect);
//Setup buses
size_t numbuses = track_count;
UInt32 size = sizeof(numbuses);
AudioUnitSetProperty(mMixer, kAudioUnitProperty_ElementCount, kAudioUnitScope_Input, 0, &numbuses, size);
//Setup Stream Format Data
AudioStreamBasicDescription desc;
size = sizeof(desc);
// Setup Stream Format
desc.mSampleRate = kGraphSampleRate;
desc.mFormatID = kAudioFormatLinearPCM;
desc.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
desc.mBitsPerChannel = sizeof(AudioSampleType) * 8; // AudioSampleType == 16 bit signed ints
desc.mChannelsPerFrame = 1;
desc.mFramesPerPacket = 1;
desc.mBytesPerFrame = sizeof(AudioSampleType);
desc.mBytesPerPacket = desc.mBytesPerFrame;
// Loop through and setup a callback for each source you want to send to the mixer.
for (int i = 0; i < numbuses; ++i) {
// Setup render callback struct
AURenderCallbackStruct renderCallbackStruct;
renderCallbackStruct.inputProc = &renderInput;
renderCallbackStruct.inputProcRefCon = self;
// Connect the callback to the mixer input channel
AUGraphSetNodeInputCallback(mGraph, mixerNode, i, &renderCallbackStruct);
// Apply Stream Data
AudioUnitSetProperty(mMixer, kAudioUnitProperty_StreamFormat,kAudioUnitScope_Input,i,&desc,size);
AudioUnitSetParameter(mMixer, k3DMixerParam_Distance, kAudioUnitScope_Input, i, rand() % 6, 0);
rotation[i] = rand() % 360;
rotation_speed[i] = rand() % 5;
AudioUnitSetParameter(mMixer, k3DMixerParam_Azimuth, kAudioUnitScope_Input, i, rotation[i], 0);
AudioUnitSetParameter(mMixer, k3DMixerParam_Elevation, kAudioUnitScope_Input, i, 30, 0);
}
// Reset stream fromat data to 0
memset (&desc, 0, sizeof (desc));
// Setup output stream format
desc.mSampleRate = kGraphSampleRate;
// Apply Stream Data to Output
AudioUnitSetProperty(mEffect,kAudioUnitProperty_StreamFormat,kAudioUnitScope_Input,0,&desc,size);
AudioUnitSetProperty(mEffect,kAudioUnitProperty_StreamFormat,kAudioUnitScope_Output,0,&desc,size);
AudioUnitSetProperty(mMixer,kAudioUnitProperty_StreamFormat,kAudioUnitScope_Output,0,&desc,size);
//All done so initialise
AUGraphInitialize(mGraph);
}
-(void)初始化图形{
AUNode输出节点;
AUNode-mixerNode;
AUNode效应节点;
新图(&mGraph);
//为图中所需的AU创建AudioComponentDescriptions
//混合元件
音频组件描述混音器描述;
混合器\u desc.componentType=kAudioUnitType\u混合器;
mixer_desc.componentSubType=kAudioUnitSubType_AU3DMixerEmbedded;
混合器描述组件标志=0;
混合器描述组件FlagsMask=0;
混合器\说明部件制造商=苹果制造商;
//输出组件
音频组件描述输出描述;
output_desc.componentType=kAudioUnitType_output;
output_desc.componentSubType=kAudioUnitSubType_RemoteIO;
输出描述组件标志=0;
输出描述组件FlagsMask=0;
输出描述组件制造商=苹果公司;
//效应分量
音频成分描述效果描述;
效果描述组件类型=kAudioUnitType效果;
效果描述组件子类型=kAudioUnitSubType\u高通滤波器;
效果描述组件标志=0;
影响描述组件FlagsMask=0;
效果描述组件制造商=苹果制造商;
//向图表中添加节点以保存音频单元
AUGraphAddNode(管理器、输出描述和输出节点);
AUGraphAddNode(管理器、混合器描述和混合器节点);
AUGraphAddNode(管理器、效果描述和效果节点);
//连接节点
AUGraphConnectNodeInput(mGraph,mixerNode,0,effectNode,0);
AUGraphConnectNodeInput(mGraph,effectNode,0,outputNode,0);
//开放图
行政主任(经理);
//获取一个到混合器的链接
AUGraphNodeInfo(mGraph、mixerNode、NULL和mMixer);
//获得一个链接到效果AU
AUGraphNodeInfo(mGraph、effectNode、NULL和meeffect);
//设置总线
大小=轨道计数;
UInt32 size=sizeof(numbuses);
AudioUnitSetProperty(mMixer、kAudioUnitProperty\u元素计数、kAudioUnitScope\u输入、0和numbuses、大小);
//设置流格式数据
音频流基本描述;
尺寸=尺寸(描述);
//设置流格式
desc.mSampleRate=kGraphSampleRate;
desc.mFormatID=kAudioFormatLinearPCM;
desc.mFormatFlags=kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
desc.mBitsPerChannel=sizeof(AudioSampleType)*8;//AudioSampleType==16位有符号整数
desc.mChannelsPerFrame=1;
desc.mFramesPerPacket=1;
desc.mBytesPerFrame=sizeof(AudioSampleType);
desc.mBytesPerPacket=desc.mBytesPerFrame;
//循环并为要发送到混音器的每个源设置回调。
for(int i=0;i
当我卸下高通滤波器时,它工作。如何使过滤器工作
多谢各位
PS:3D提升应该什么都不做吗?如果你仍然有问题……你应该在mixernode和effect节点之间添加一个转换器单元,并将其输入格式设置为混音器输出,输出格式设置为从audiounitgetproperty(converternode)获取的格式并非所有OSX上可用的音频单元都在iOS上可用。事实上,只有少数人是。根据以下文档,iOS不支持highpassfilter效果: “iPod EQ单元(子类型kAudioUnitSubType_AUiPodEQ)是iOS 4中提供的唯一效果单元。”
注意,它提到了iOS4。但是我找不到任何关于iOS更高版本的文档 我以前遇到过这个10863错误,“kAudioUnitErr\u CannotDoInCurrentContext”。我还没有找到一个详细的解释,虽然没有(它是超级过时)。但自从iOS 5以来,iOS中也有很多新的效果单元可用。