• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

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

[复制链接]
菜鸟教程小白 发表于 2022-12-13 16:57:59 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

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

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

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

AURenderCallbackStruct splitterCallback;
    splitterCallback.inputProc = (AURenderCallback) SplitterCallback;
    splitterCallback.inputProcRefCon = (__bridge void*) self;
    status = AudioUnitSetProperty(splitterAuUnit,
                                  kAudioUnitProperty_SetRenderCallback,
                                  kAudioUnitScope_Input,
                                  0, &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
                          &genericOutToIoUnitIn,                // connection definition
                          sizeof (genericOutToIoUnitIn)
                          );

// Callback
static OSStatus SplitterCallback(void                        *inRefCon,
                               AudioUnitRenderActionFlags  *ioActionFlags,
                               const AudioTimeStamp        *inTimeStamp,
                               UInt32                      inBusNumber,
                               UInt32                      inNumberFrames,
                               AudioBufferList             *ioData)
    {
    @autoreleasepool {
        NSLog(@"splitterCallback"); // This is never called. 
    }
}



Best Answer-推荐答案


这是在不破坏 API 的情况下在 AUGraph API 中注册回调的 Core Audio 过程。它在 OSX 中进行了测试,但这部分 API 对 iOS 也是通用的。假设您想收听来自输出单元输入的信号,一个“上游”单元将是 splitterAuUnit。我将通过以下方式注册回调 MyRenderProc():

AudioUnitAddRenderNotify(splitterAuUnit,
                         MyRenderProc,
                         &player);

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

if (*ioActionFlags & kAudioUnitRenderAction_PostRender){
    static int TEMP_kAudioUnitRenderAction_PostRenderError = (1 << 8);
    if (!(*ioActionFlags & TEMP_kAudioUnitRenderAction_PostRenderError)){

        Float32* data = (Float32 *)ioData->mBuffers[0].mData; //just for one channel!
    //    …   …   
    }
}

关于ios - 如果该单元同时连接到输入单元和输出单元,是否有 iOS 核心音频单元的回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37666844/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap