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 技术:使效果节点和乐器节点独立的主要内容,如果未能解决你的问题,请参考以下文章

如何在xcode中禁用inter audio应用程序

安卓audio时长加载为0

audio标签HOVER效果rgba和opacity隐藏场景

Html的Video和Audio 如何循环播放1个mp3,如何编写代码使循环到下次播放时没有停顿!

如何在 HTML5 静音按钮中应用淡入淡出效果

[js开源组件开发]html5标签audio的样式更改