iphone – 在向AUGraph添加kAudioUnitSubType_Reverb2时,AUGraphInitialize错误代码-10868

iphone – 在向AUGraph添加kAudioUnitSubType_Reverb2时,AUGraphInitialize错误代码-10868,第1张

概述我正在尝试将类型为kAudioUnitSubType_Reverb2的AudioUnit添加到AUGraph,并在AUGraphInitialize上获得-10868(kAudioUnitErr_FormatNotSupported)支持的错误.我的出发点是Apple的iPhoneMixerEQGraphTest示例应用程序,我基本上只是为混响添加了一个新的AudioUnit,但无法让它工作. 这 我正在尝试将类型为kAudioUnitSubType_Reverb2的AudioUnit添加到AUGraph,并在AUGraphInitialize上获得-10868(kAudioUnitErr_FormatNotSupported)支持的错误.我的出发点是Apple的iPhonemixerEQGraphTest示例应用程序,我基本上只是为混响添加了一个新的AudioUnit,但无法让它工作.

这是代码 –

- (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所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1050382.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存