这是代码 –
- (voID)initializeAUGraph{ printf("initializeAUGraph\n"); AUNode outputNode; AUNode eqNode; AUNode mixerNode; AUNode reverbNode; printf("create clIEnt ASBD\n"); // clIEnt format audio goes into the mixer mClIEntFormat.SetCanonical(2,true); mClIEntFormat.mSampleRate = kGraphSampleRate; mClIEntFormat.Print(); printf("create output ASBD\n"); // output format mOutputFormat.SetAUCanonical(2,false); mOutputFormat.mSampleRate = kGraphSampleRate; mOutputFormat.Print(); Osstatus result = noErr; // load up the audio data [self performSelectorInBackground:@selector(loadfiles) withObject:nil]; printf("new AUGraph\n"); // create a new AUGraph result = NewAUGraph(&mGraph); if (result) { printf("NewAUGraph result %ld %08X %4.4s\n",result,(unsigned int)result,(char*)&result); return; } // create three CAComponentDescription for the AUs we want in the graph // output unit CAComponentDescription output_desc(kAudioUnitType_Output,kAudioUnitSubType_RemoteIO,kAudioUnitManufacturer_Apple); // ipodeQ unit CAComponentDescription eq_desc(kAudioUnitType_Effect,kAudioUnitSubType_AUipodeQ,kAudioUnitManufacturer_Apple); // multichannel mixer unit CAComponentDescription mixer_desc(kAudioUnitType_mixer,kAudioUnitSubType_MultiChannelmixer,kAudioUnitManufacturer_Apple); // reverb unit CAComponentDescription reverb_desc(kAudioUnitType_Effect,kAudioUnitSubType_Reverb2,kAudioUnitManufacturer_Apple); printf("add nodes\n"); // create a node in the graph that is an AudioUnit,using the supplIEd AudioComponentDescription to find and open that unit result = AUGraphAddNode(mGraph,&output_desc,&outputNode); if (result) { printf("AUGraphNewNode 1 result %lu %4.4s\n",(char*)&result); return; } result = AUGraphAddNode(mGraph,&eq_desc,&eqNode); if (result) { printf("AUGraphNewNode 2 result %lu %4.4s\n",&mixer_desc,&mixerNode); if (result) { printf("AUGraphNewNode 3 result %lu %4.4s\n",&reverb_desc,&reverbNode); if (result) { printf("AUGraphNewNode 4 result %lu %4.4s\n",(char*)&result); return; } // connect a node's output to a node's input // mixer -> eq -> output result = AUGraphConnectNodeinput(mGraph,mixerNode,eqNode,0); if (result) { printf("AUGraphConnectNodeinput result %lu %4.4s\n",(char*)&result); return; } result = AUGraphConnectNodeinput(mGraph,reverbNode,outputNode,0); if (result) { printf("AUGraphConnectNodeinput reverb result %lu %4.4s\n",(char*)&result); return; } // open the graph AudioUnits are open but not initialized (no resource allocation occurs here) result = AUGraphOpen(mGraph); if (result) { printf("AUGraphOpen result %ld %08X %4.4s\n",(char*)&result); return; } // grab the audio unit instances from the nodes result = AUGraphNodeInfo(mGraph,NulL,&mmixer); if (result) { printf("AUGraphNodeInfo result %ld %08X %4.4s\n",(char*)&result); return; } result = AUGraphNodeInfo(mGraph,&mEQ); if (result) { printf("AUGraphNodeInfo result %ld %08X %4.4s\n",&mReverb); if (result) { printf("AUGraphNodeInfo reverb result %ld %08X %4.4s\n",(char*)&result); return; } // set bus count UInt32 numbuses = 2; printf("set input bus count %lu\n",numbuses); result = AudioUnitSetProperty(mmixer,kAudioUnitProperty_ElementCount,kAudioUnitScope_input,&numbuses,sizeof(numbuses)); if (result) { printf("AudioUnitSetProperty result %ld %08X %4.4s\n",(char*)&result); return; } for (int i = 0; i < numbuses; ++i) { // setup render callback struct AURenderCallbackStruct rcbs; rcbs.inputProc = &renderinput; rcbs.inputProcRefCon = &mUserData; printf("set AUGraphSetNodeinputCallback\n"); // set a callback for the specifIEd node's specifIEd input result = AUGraphSetNodeinputCallback(mGraph,i,&rcbs); if (result) { printf("AUGraphSetNodeinputCallback result %ld %08X %4.4s\n",(char*)&result); return; } printf("set input bus %d,clIEnt kAudioUnitProperty_StreamFormat\n",i); // set the input stream format,this is the format of the audio for mixer input result = AudioUnitSetProperty(mmixer,kAudioUnitProperty_StreamFormat,&mClIEntFormat,sizeof(mClIEntFormat)); if (result) { printf("AudioUnitSetProperty result %ld %08X %4.4s\n",(char*)&result); return; } } printf("get EQ kAudioUnitProperty_FactoryPresets\n"); // get the eq's factory preset List -- this is a read-only CFArray array of AUPreset structures // host owns the retuned array and should release it when no longer needed UInt32 size = sizeof(mEQPresetsArray); result = AudioUnitGetProperty(mEQ,kAudioUnitProperty_FactoryPresets,kAudioUnitScope_Global,&mEQPresetsArray,&size); if (result) { printf("AudioUnitGetProperty result %ld %08X %4.4s\n",(char*)&result); return; } /* this code can be used if you're interested in dumPing out the preset List printf("ipodeQ Factory Preset List:\n"); UInt8 count = CFArrayGetCount(mEQPresetsArray); for (int i = 0; i < count; ++i) { AUPreset *aPreset = (AUPreset*)CFArrayGetValueAtIndex(mEQPresetsArray,i); CFShow(aPreset->presetname); }*/ printf("set output kAudioUnitProperty_StreamFormat\n"); // set the output stream format of the mixer result = AudioUnitSetProperty(mmixer,kAudioUnitScope_Output,&mOutputFormat,sizeof(mOutputFormat)); if (result) { printf("AudioUnitSetProperty result %ld %08X %4.4s\n",(char*)&result); return; } printf("set render notification\n"); // add a render notification,this is a callback that the graph will call every time the graph renders // the callback will be called once before the graph’s render operation,and once after the render operation is complete result = AUGraphAddRenderNotify(mGraph,renderNotification,&mUserData); if (result) { printf("AUGraphAddRenderNotify result %ld %08X %4.4s\n",(char*)&result); return; } printf("AUGraphInitialize\n"); // Now that we've set everything up we can initialize the graph,this will also valIDate the connections result = AUGraphInitialize(mGraph); if (result) { printf("AUGraphInitialize result %ld %08X %4.4s\n",(char*)&result); return; } // ---- result here is error code 10868 CAShow(mGraph);}解决方法 出于某种原因,一些AU节点默认采用float格式的流格式,而其他节点则采用整数形式.如果流格式不匹配,则会出现此错误.因此,您需要在均衡器节点和混响节点之间添加格式转换器:
AudioComponentDescription convertUnitDescription;convertUnitDescription.componentManufacturer = kAudioUnitManufacturer_Apple;convertUnitDescription.componentType = kAudioUnitType_FormatConverter;convertUnitDescription.componentSubType = kAudioUnitSubType_AUConverter;convertUnitDescription.componentFlags = 0;convertUnitDescription.componentFlagsMask = 0;result = AUGraphAddNode (graph,&convertUnitDescription,&convertNode);NSCAssert (result == noErr,@"Unable to add the converted unit to the audio processing graph. Error code: %d '%.4s'",(int) result,(const char *)&result);
确保将转换器节点输入的流格式设置为均衡器节点输出的格式:
AudioStreamBasicDescription eqStreamFormat;UInt32 streamFormatSize = sizeof(eqStreamFormat);result = AudioUnitGetProperty(eqUnit,&eqStreamFormat,&streamFormatSize);NSAssert (result == noErr,@"Unable to get eq output format. Error code: %d '%.4s'",(const char *)&result);result = AudioUnitSetProperty(convertUnit,streamFormatSize);NSAssert (result == noErr,@"Unable to set converter input format. Error code: %d '%.4s'",(const char *)&result);
并对转换器的输出执行相同 *** 作,使用混响的输入格式进行设置.这应该使您的图形初始化并运行,但是如果您设法使混响节点实际上做某事,请告诉我,因为它对我不起作用.
总结以上是内存溢出为你收集整理的iphone – 在向AUGraph添加kAudioUnitSubType_Reverb2时,AUGraphInitialize错误代码-10868全部内容,希望文章能够帮你解决iphone – 在向AUGraph添加kAudioUnitSubType_Reverb2时,AUGraphInitialize错误代码-10868所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)