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);
}