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 13:05:43 +0100
I'm using PlayAndRecord session mode.
With internal speaker/mic I get:
256 frame buffer size
- buffer duration 5.8 ms
- input latency 12.15 ms
- output latency 17.66 ms
And recording a metronome click via speaker -> mic and compensating
for calculated round-trip latency shows an extra 8 ms delay.
If I turn on MeasurementMode I get:
- device input latency 0.14 ms
- output latency 2.7 ms
But still the same extra 8 ms unknown delay.
On Tue, Jan 21, 2020 at 10:13 AM Arshia Cont <email@hidden> wrote:
>
> Just out of curiosity, what is your AVAudioSession mode? What if you use
> internal speaker/microphone?
>
> > On 21 Jan 2020, at 09:36, Jonatan Liljedahl <email@hidden> wrote:
> >
> > 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
>
--
/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