菜鸟教程小白 发表于 2022-12-13 16:57:59

ios - 如果该单元同时连接到输入单元和输出单元,是否有 iOS 核心音频单元的回调?


                                            <p><p>我有一个音频单元,它位于其他两个单元之间。也就是说,我的单元有另一个单元分配给它的输入节点,它有另一个单元分配给它的输出节点。</p>

<p>我想访问输入到我的单元中的 AudioBufferList。我想在回调中访问这个缓冲区列表。但是,如果我的单元的输入总线已经连接到另一个音频单元,那么我的 RenderCallback 永远不会被调用。 </p>

<p>我可以使用什么回调来访问给定单元的传入音频缓冲区?</p>

<pre><code>AURenderCallbackStruct splitterCallback;
    splitterCallback.inputProc = (AURenderCallback) SplitterCallback;
    splitterCallback.inputProcRefCon = (__bridge void*) self;
    status = AudioUnitSetProperty(splitterAuUnit,
                                  kAudioUnitProperty_SetRenderCallback,
                                  kAudioUnitScope_Input,
                                  0, &amp;splitterCallback,sizeof(splitterCallback));


AudioUnitElement genericOutputBus= 0;
    AudioUnitConnection genericOutToIoUnitIn;
    genericOutToIoUnitIn.sourceAudioUnit    = genericAuUnit;
    genericOutToIoUnitIn.sourceOutputNumber = genericOutputBus;
    genericOutToIoUnitIn.destInputNumber    = ioUnitOutputElement;



    AudioUnitSetProperty (
                        splitterAuUnit,                     // connection destination
                        kAudioUnitProperty_MakeConnection,// property key
                        kAudioUnitScope_Input,            // destination scope
                        ioUnitOutputElement,                // destination element
                        &amp;genericOutToIoUnitIn,                // connection definition
                        sizeof (genericOutToIoUnitIn)
                        );

// Callback
static OSStatus SplitterCallback(void                        *inRefCon,
                               AudioUnitRenderActionFlags*ioActionFlags,
                               const AudioTimeStamp      *inTimeStamp,
                               UInt32                      inBusNumber,
                               UInt32                      inNumberFrames,
                               AudioBufferList             *ioData)
    {
    @autoreleasepool {
      NSLog(@&#34;splitterCallback&#34;); // This is never called. :(
    }
}
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>这是在不破坏 API 的情况下在 AUGraph API 中注册回调的 Core Audio 过程。它在 OSX 中进行了测试,但这部分 API 对 iOS 也是通用的。假设您想收听来自输出单元输入的信号,一个“上游”单元将是 <code>splitterAuUnit</code>。我将通过以下方式注册回调 <code>MyRenderProc()</code>:</p>

<pre><code>AudioUnitAddRenderNotify(splitterAuUnit,
                         MyRenderProc,
                         &amp;player);
</code></pre>

<p>在您的回调中,检查渲染操作和发布渲染错误很重要:</p>

<pre><code>if (*ioActionFlags &amp; kAudioUnitRenderAction_PostRender){
    static int TEMP_kAudioUnitRenderAction_PostRenderError = (1 &lt;&lt; 8);
    if (!(*ioActionFlags &amp; TEMP_kAudioUnitRenderAction_PostRenderError)){

      Float32* data = (Float32 *)ioData-&gt;mBuffers.mData; //just for one channel!
    //    …   …   
    }
}
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 如果该单元同时连接到输入单元和输出单元,是否有 iOS 核心音频单元的回调?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/37666844/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/37666844/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 如果该单元同时连接到输入单元和输出单元,是否有 iOS 核心音频单元的回调?