Inter App Audio技术:使节点和仪器节点独立

时间:2016-12-21 06:47:19

标签: ios objective-c core-audio avaudiosession

我正在编写一个使用 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初始化失败,错误

     来自AUGraphInitialize(hostGraph)的

-10860错误-10860

注意: - 我还附上了代码部分的截图,以便更好地理解。

enter image description here

编辑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 个答案:

答案 0 :(得分:0)

因此,根据apple docs,您所看到的错误归因于The specified node cannot be found

看起来您已经使用了您链接的Apple示例应用,只是删除了一点以尝试删除1个节点,但我不相信它那么简单。该示例的文档清楚地说明了两个节点依赖。只是更改遥控器方法的添加是不够的,因为主机仍在尝试创建两者,如您所看到的错误所示。

从示例项目中的file开始,您只显示对addRemoteAU所做的更改,但您还需要对createGraph进行更改,因为这是hostGraph已使用其节点进行初始化。如果仅使用1个节点初始化图形,那么在addRemoteAU中,您应该停止看到由于找不到节点而导致的错误,因为此时的图表不会期望有两个节点(现在它会执行此操作)从它的创作)。