Hi Chris, and thanks for your input. Yeah this is for that Link stuff...
Thanks for the explanations and diagrams, and it's pretty much as i guessed.
But i don't think you properly see what my workaround does.
See, the problem is not with latency, per say...because the Link framework has that covered...so we can have quite a bit of latency, and as far as i know, all devices just sync to the slowest one.
The problem is, that messages coming into libPd seem to only be processed on these multi-block boundaries. Even with just 10ms or 20ms of samples per process loop, that's still a lot of drift for something like a drum machine sending sync every 120ms or whatever.
So to go back to your diagram:
a: >XX|XX|X_|__|*_|__|__|__>
b: >XX|XX|XX|XX|*X|XX|X_|__>
in this case, i would assume that the * message sent to (a) is processed at the beginning of the next multi-block.
BUT, i would also assume that the * message sent to (b) is also processed at the beginning of the next multi-block - because: messages are only converted to audio on block boundaries. In this case, because you are processing 8 blocks at once, then messages will only be processed at the beginning of the next 8 blocks, regardless of where they appear, or how far the processing has proceeded. I just can't see that it could be any different.
So, what you get, is this system where messages are only processed in the audio thread every time that multi-block boundary is reached....just as messages in pd itself are just added to the audio thread on block block boundaries.
BUT....there is a workaround in pd. You can use the scheduler, via [delay], [pipe], [metro] to make sure that messages are triggered in the audio thread between blocks.
It's that type of behaviour that i want to leverage to make sure that clock messages are delayed the correct amount in the next block so that we don't get this wonky sync. Yes, i understand that means that we have to have added latency, but as you said Chris,
"You can't really work around physics"