Is there a Callback for an iOS Core Audio Unit, if the unit is connected to both an input unit and output unit? -
i have audio unit sitting between 2 other units. say, unit has unit assigned input node, , has unit assigned output node.
i want access audiobufferlist fed unit. access buffer list within callback. however, if unit's input bus connected audio unit, rendercallback never called.
what callback can use access passed-in audio buffer(s) of given unit?
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"); // never called. :( } }
here core audio procedure registering callback within augraph api without breaking api. tested in osx, part of api common ios too. assuming want listen signal input of output unit, 1 unit "upstream" splitterauunit
. register callback myrenderproc()
in following way:
audiounitaddrendernotify(splitterauunit, myrenderproc, &player);
inside callback important check render actions , post render errors:
if (*ioactionflags & kaudiounitrenderaction_postrender){ static int temp_kaudiounitrenderaction_postrendererror = (1 << 8); if (!(*ioactionflags & temp_kaudiounitrenderaction_postrendererror)){ float32* data = (float32 *)iodata->mbuffers[0].mdata; //just 1 channel! // … … } }