Inter App Audio 技术:使效果节点和乐器节点独立
Posted
技术标签:
【中文标题】Inter App Audio 技术:使效果节点和乐器节点独立【英文标题】:Inter App Audio technology : make effect node and instrument node independent 【发布时间】:2016-12-21 06:47:19 【问题描述】:我正在编写一个使用 Core Audio 新的 ios 7 Inter App Audio 技术 的 HOST 应用程序。在Inter-App Audio Examples 的帮助下,我设法获得了乐器应用程序和效果器应用程序。
问题在于效果节点依赖仪器节点。我想让效果节点和乐器节点独立。
这是我的尝试。
if (desc.componentType == kAudioUnitType_RemoteEffect)
// if ([self isRemoteInstrumentConnected])
if (!_engineStarted) // Check if session is active
[self checkStartOrStopEngine];
if ([self isGraphStarted]) // Check if graph is running and or is created, if so, stop it
[self checkStartStopGraph];
if ([self checkGraphInitialized ]) // Check if graph has been inititialized if so, uninitialize it.
Check(AUGraphUninitialize(hostGraph));
Check (AUGraphAddNode (hostGraph, &desc, &effectNode)); // Add remote instrument
//Disconnect previous chain
// Check(AUGraphDisconnectNodeInput(hostGraph, mixerNode, remoteBus));
//Connect the effect node to the mixer on the remoteBus
Check(AUGraphConnectNodeInput (hostGraph, effectNode, 0, mixerNode, remoteBus));
//Connect the remote instrument node to the effect node on bus 0
Check(AUGraphConnectNodeInput (hostGraph, instrumentNode, 0, effectNode, 0));
//Grab audio units from the graph
Check(AUGraphNodeInfo(hostGraph, effectNode, 0, &effect));
currentUnit = &effect;
if (currentUnit)
Check (AudioUnitSetProperty (*currentUnit, // Set stereo format
kAudioUnitProperty_StreamFormat,
kAudioUnitScope_Output,
playerBus,
&stereoStreamFormat,
sizeof (stereoStreamFormat)));
UInt32 maxFrames = 4096;
Check(AudioUnitSetProperty(*currentUnit,
kAudioUnitProperty_MaximumFramesPerSlice,
kAudioUnitScope_Global, playerBus,
&maxFrames,
sizeof(maxFrames)));
[self addAudioUnitPropertyListeners:*currentUnit]; // Add property listeners to audio unit
Check(AUGraphInitialize (hostGraph)); // Initialize the graph
[self checkStartStopGraph]; //Start the graph
[_connectedNodes addObject:rau];
但我的应用程序在这条线上崩溃 --
Check(AUGraphInitialize (hostGraph));
我得到的错误,
ConnectAudioUnit 失败并出现错误
-10860 初始化失败并出现错误
-10860 来自 AUGraphInitialize (hostGraph) 的错误 -10860
注意:- 我还附上了代码部分的屏幕截图以便更好地理解。
编辑 1:-
- (void)createGraph
// 1
NewAUGraph(&hostGraph);
// 2
AudioComponentDescription iOUnitDescription;
iOUnitDescription.componentType =
kAudioUnitType_Output;
iOUnitDescription.componentSubType =
kAudioUnitSubType_RemoteIO;
iOUnitDescription.componentManufacturer =
kAudioUnitManufacturer_Apple;
iOUnitDescription.componentFlags = 0;
iOUnitDescription.componentFlagsMask = 0;
AUGraphAddNode(hostGraph, &iOUnitDescription, &outNode);
// 3
AUGraphOpen(hostGraph);
// 4
Check(AUGraphNodeInfo(hostGraph, outNode, 0, &outputUnit));
// 5
AudioStreamBasicDescription format;
format.mChannelsPerFrame = 2;
format.mSampleRate =
[[AVAudioSession sharedInstance] sampleRate];
format.mFormatID = kAudioFormatLinearPCM;
format.mFormatFlags =
kAudioFormatFlagsNativeFloatPacked |
kAudioFormatFlagIsNonInterleaved;
format.mBytesPerFrame = sizeof(Float32);
format.mBytesPerPacket = sizeof(Float32);
format.mBitsPerChannel = 32;
format.mFramesPerPacket = 1;
AudioUnitSetProperty(mixerUnit,
kAudioUnitProperty_StreamFormat,
kAudioUnitScope_Output,
1,
&format,
sizeof(format));
AudioUnitSetProperty(mixerUnit,
kAudioUnitProperty_StreamFormat,
kAudioUnitScope_Input,
0,
&format,
sizeof(format));
CAShow(hostGraph);
【问题讨论】:
【参考方案1】:因此,根据apple docs,您看到的错误是由The specified node cannot be found
引起的。
看起来您已经使用了您链接的 Apple 示例应用程序,只是删除了一点以尝试删除 1 个节点,但我不相信它那么简单。该示例的文档清楚地说明了这两个节点是依赖。仅更改添加远程方法是不够的,因为 host 仍在尝试创建两者,如您看到的错误所示。
从示例项目中的 file 开始,您只显示了对 addRemoteAU
所做的更改,但您还需要对 createGraph
进行更改,因为这是 hostGraph
初始化的地方它的节点。如果您仅使用 1 个节点初始化图形,那么在 addRemoteAU
中,由于找不到节点,您应该不会再看到错误,因为此时的图形不会期望两个节点(它现在从它的创建开始) .
【讨论】:
感谢重播。你能详细解释一下吗?比如,在创建图表中需要进行哪些必要的更改?你能帮忙看看代码到底应该删除什么吗? 由于您没有发布您在该方法中尝试过的内容,我真的不能。根据您提供的信息,我已经提供了尽可能多的详细信息,但考虑到您已经尝试从示例应用程序中删除几行,我不会编写代码您需要在无法理解您的尝试的情况下解决您的问题(到目前为止,我所看到的只是一个复制粘贴的示例应用程序部分,其中删除了几行,没有其他更改)。以上是关于Inter App Audio 技术:使效果节点和乐器节点独立的主要内容,如果未能解决你的问题,请参考以下文章
audio标签HOVER效果rgba和opacity隐藏场景