Re: CoreAudio: Calculate total latency between input and output with kAudioUnitSubType_VoiceProcessingIO
Re: CoreAudio: Calculate total latency between input and output with kAudioUnitSubType_VoiceProcessingIO
- Subject: Re: CoreAudio: Calculate total latency between input and output with kAudioUnitSubType_VoiceProcessingIO
- From: Jonatan Liljedahl via Coreaudio-api <email@hidden>
- Date: Tue, 21 Jan 2020 09:36:13 +0100
Hi,
On Mon, Jan 20, 2020 at 9:58 PM Arshia Cont <email@hidden> wrote:
>
> Jonathan,
>
> First of all: Paul Davis is right. Both “internalLatency” and “outputLatency”
> values from AVAudioSession are estimations and not exact. They are most
> reliable when used without any external audio. Least reliable of course with
> Bluetooth!
Of course. In my testing, I get an additional 3ms round-trip latency
that is not part of the calculation.
> Now:
> I was also surprised to see the ‘4’ factor instead of ‘2’! My only raw guess
> is because my stream is stereo (which doesn’t make sense!).
>
> The formula you sent is more or less correct. It actually depends on the
> values of ioBufferDuration and the other two latencies. Think of it this way:
> If the outputLatency is higher than the ioBuffer it probably means that the
> output buffer is also longer, then in a Pull system you need more of the
> system buffers to fill out that buffer. In most real-time scheduling
> mechanisms we introduce lags to make sure underflow or overflow doesn’t occur.
I just did a quick test here using my app AUM.
Focusrite Scarlett 6i6 connected via USB and lightning-to-USB adapter,
with loop-back cable from out to in, 44.1kHz, using two different
buffer sizes:
64 frame buffer size:
- buffer duration = 1.45 ms
- input latency = 1.02 ms
- output latency = 1.54 ms
- calculated round-trip latency (inputLatency + outputLatency + 2 *
ioBufferDuration) = 5.46 ms
256 frame buffer size:
- buffer duration = 5.80 ms
- input latency = 1.02 ms
- output latency = 1.54 ms
- calculated round-trip latency = 14.17 ms
This is also a stereo stream BTW, which I don't think is relevant. In
both cases I get about 3 ms extra latency, not part of the
calculation. I don't have a setting for buffer sizes smaller than 64
frames, so I didn't test the case where inputLatency >
ioBufferDuration.
Using `4 * ioBufferDuration` would yield a larger error in the second
case, and it would give a different error in the two cases. I still
believe 2 is the correct factor to use!
> PS: Nice Apps! ;)
Thanks! :)
/Jonatan
> On 20 Jan 2020, at 19:24, Jonatan Liljedahl <email@hidden> wrote:
>
> On Mon, Jan 20, 2020 at 6:36 PM Arshia Cont via Coreaudio-api
> <email@hidden> wrote:
>
> You get the following from AVAudioSession:
> inputLatency
> outputLatency
> ioBufferDuration
>
> Then your throughput latency, assuming a Stereo Stream, would be:
> inputLatency + outputLatency + 4*ioBufferDuration
>
>
> I did the same, but I arrived at inputLatency + outputLatency + 2 *
> ioBufferDuration!
>
> In case inputLatency > ioBufferDuration, you add one more ioBufferDuration.
> Same with outputLatency! This means that when lowering your ioBufferDuration,
> your Session mode becomes important (which directly affects input and output
> latencies). The lowest you can achieve would thus be with the Measurement
> Mode.
>
>
> So you mean the formula would be:
>
> inputLatency + outputLatency + (inputLatency > ioBufferDuration ? 5 :
> 4) * ioBufferDuration
>
> Do you have an explanation why?
>
> --
> /Jonatan
> http://kymatica.com
>
>
--
/Jonatan
http://kymatica.com
_______________________________________________
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