macOS Round Trip Latency

So I tried to add up all the latencies together and the latency detector demo still doesn’t return 0 (or close to it) with this change. Am I doing something wrong:

int getLatencyFromDevice (AudioObjectPropertyScope scope) const
{
    auto bufferSizeProperty = static_cast<UInt32> (bufferSize);
    UInt32 size = sizeof (bufferSizeProperty);
    AudioObjectPropertyAddress pa;
    pa.mElement = juceAudioObjectPropertyElementMain;
    pa.mSelector = kAudioDevicePropertyBufferFrameSize;
    pa.mScope = kAudioObjectPropertyScopeWildcard;
    AudioObjectGetPropertyData (deviceID, &pa, 0, nullptr, &size, &bufferSizeProperty);
    
    UInt32 deviceLatency = 0;
    size = sizeof (deviceLatency);
    pa.mSelector = kAudioDevicePropertyLatency;
    pa.mScope = scope;
    AudioObjectGetPropertyData (deviceID, &pa, 0, nullptr, &size, &deviceLatency);

    UInt32 safetyOffset = 0;
    size = sizeof (safetyOffset);
    pa.mSelector = kAudioDevicePropertySafetyOffset;
    AudioObjectGetPropertyData (deviceID, &pa, 0, nullptr, &size, &safetyOffset);
    
    UInt32 streamLatency = 0;
    size = 0;
    pa.mSelector = kAudioDevicePropertyStreams;
    AudioObjectGetPropertyDataSize (deviceID, &pa, 0, nullptr, &size);
    
    if (size >= sizeof (AudioStreamID))
    {
        HeapBlock<AudioStreamID> streamIDs (size / sizeof (AudioStreamID));
        AudioObjectGetPropertyData (deviceID, &pa, 0, nullptr, &size, streamIDs);
        
        // get the latency of the first stream
        size = sizeof (deviceLatency);
        pa.mSelector = kAudioStreamPropertyLatency;
        AudioObjectGetPropertyData (streamIDs[0], &pa, 0, nullptr, &size, &streamLatency);
    }

    return (int) (deviceLatency + safetyOffset + bufferSizeProperty + streamLatency);
}