Re: Using VoiceProcessingIO Audio Unit
Re: Using VoiceProcessingIO Audio Unit
- Subject: Re: Using VoiceProcessingIO Audio Unit
- From: Adit Ranadive <email@hidden>
- Date: Wed, 22 Oct 2014 11:59:33 -0700
Hi Steven,
Thanks for the detailed reply. You mentioned that you saw some example
programs for the real time threads - can you share any links with me
if you still have access to those? Also, can you point me to your
email on the list that mentions the AduioUnitRender and AUGraph
problem?
Thanks in advance!
Adit
On Tue, Oct 21, 2014 at 9:29 AM, Steven Clark <email@hidden> wrote:
> I did a great deal of experimentation and research to get the VPIO unit to work for me on both OS X and iOS. The VPIO unit is not, in general, a drop in replacement for remoteIO. There are some cases where it can drop in, others where it cannot. It is not completely the same on OS X and iOS, either - or rather, it cannot be, because of subtle differences in the two environments. I did this work on Mavericks and iOS 7, so it was a short while back.
>
> Here are some potentially helpful remarks from my notes:
> * It seems to be necessary to turn off MuteOutput on the VPIO unit; that property doesn't exist on AHAL. ("Seems" means I was uncertain.)
> * The VPIO unit gives two callbacks, the "input" callback (VPIO gives the callee data from the microphone) and "render" callback (VPIO expects the callee to provide data destined for the speaker). However if you use the AUGraph API, the AUGraphSetInputCallback() function sets the render callback, not the input callback. This cost me a great deal of time.
> * The VPIO unit does some fancy footwork so that its input and output hardware do not need to be synchronized or linked in any way, very unlike AHAL.
> * VPIO and AHAL each have a certain amount of built-in format conversion capability, but they are not the same. Hence some apps will need a converter unit for one but not the other. I did not note the specifics, sorry.
> * When your callback provides data to VPIO, it must fill in exactly the number of samples requested - no more, no less. Also, it cannot block (or at least, not for long). It's called on a real time thread and if it doesn't return quickly enough you'll get crap out the speaker. If you think about it, this is (to me, anyway) obvious. The example programs I've seen all use CARingBuffer to buffer data, but for some purposes that's not necessary and ends up copying data extra times.
> * When you set up your input callback, on AHAL the element is ignored but on VPIO it has to be element 1 (input, i.e. microphone) and the global scope.
> * The VPIO unit does not have the StartTimestampsAtZero property even though all output units are supposed to have it.
> * A number of audio unit properties are write-only. This really sucked when trying to debug what was going on, especially since this is not mentioned in any Apple documentation nor anywhere on the web that I could find.
>
> I was never able to get an AUConverter unit to automatically connect to a VPIO unit. I wanted data to flow from the AUConverter to the VPIO (and out the speaker). So, I wanted the VPIO's rendering to pull data from the AUConverter. I tried using the AUGraph API - AUGraphConnectNodeInput(), and that didn't work. I tried using the equivalent AudioUnit API - AudioUnitSetProperty(..., kAudioUnitProperty_MakeConnection, ...) and that didn't work either. I wrote a trivial function for the render callback of the VPIO, that calls AudioUnitRender() on the AUConverter, and it worked perfectly when set up with either the AUGraph or Audio Unit API. (That is, with AUGraphSetNodeInputCallback() or AudioUnitSetProperty(..., kAudioUnitProperty_SetRenderCallback,...).) I posted about it to this list and a helpful person eventually reproduced the problem. I submitted a bug to Apple and last I heard nothing happened.
>
> The actual echo cancellation of VPIO is quite good. I just wish it weren't such a massive research project to get it to work in an application.
>
> Hope this helps.
>
> Steven J. Clark
> VGo Communications
>
> -----Original Message-----
> From: coreaudio-api-bounces+steven.clark=email@hidden [mailto:coreaudio-api-bounces+steven.clark=email@hidden] On Behalf Of Adit Ranadive
> Sent: Monday, October 20, 2014 1:58 PM
> To: email@hidden
> Subject: Using VoiceProcessingIO Audio Unit
>
> Hi,
>
> I am trying to write a sample VoIP application that uses the VoiceProcessingIO audio unit to perform echo cancellation. However, I am ending up with an error "-10851" (InvalidPropertyValue) when calling AudioUnitRender in my inputCallback function.
>
> I am running this on Mac OS X 10.9 and from the Mac developer library it seems that VoiceProcessing was added in OS X 10.7.
>
> My sample code is similar to the one given here:
> http://atastypixel.com/blog/using-remoteio-audio-unit/
>
> Except that I am using VoiceProcessingIO type audio unit and do not call enableIO on the VoiceProcessing unit. In my input callback however, I am passing my own allocated buffers to AudioUnitRender.
>
> Any suggestions for getting to fix the error?
>
> Thanks,
> Adit
> _______________________________________________
> Do not post admin requests to the list. They will be ignored.
> Coreaudio-api mailing list (email@hidden)
> Help/Unsubscribe/Update your Subscription:
>
> This email sent to email@hidden
_______________________________________________
Do not post admin requests to the list. They will be ignored.
Coreaudio-api mailing list (email@hidden)
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden