Wolfgang Jäger wrote:
Hello,
I'm using a combination of [pack~] [packOSC] -> transmission(UDP) -> [unpackOSC] and a modified version of [unpack~] to send Audio over OSC. The OSC packages are sent as Bundles so a TimeTag is generated at the sender's side. I extended the [unpackOSC] object with another outlet where I'm getting the particular TimeTag of each Bundle. In the modified version of [unpack~] I evaluate these TimeTags with regards to dropouts in the transmission. My problem is that the TimeTags are not accurate, what I ascribe to the fact, that the TimeTag in [packOSC] is generated as "real time" instead of "logical time". Using "real time" the TimeTag-"Output" is a function of the audiobuffersize (depending on the cpu load), so in my case, as the CPU-load is quite big, the values of the TimeTags are not useable for sequencing the datastream (as there are jumps in the TimeTag I always assume some packages got lost). As a workaround I established a sequence number, which is additionally transmitted in each Bundle. This is an appropiate solution, but it wouldn't be necessary if the TimeTag would be generated properly. Are my considerations conclusive?
At the moment the timetag is calculated when the bundle is opened with the [ message. If the ] message doesn't occur at the same time the timetag will be wrong as the message doesn't start to get sent until the bundle is closed. Then there is the delay in the OS as it schedules the packet for the network and the network card deals with possible collisions with other packets, etc... As well, anything [packOSC] does occurs between audio blocks (and may be postponed if there is too much going on), so the timing will be jittery unless your packets are being composed and sent in precise sync with the audio. And if they are being sent to another machine with another clock of course this is never going to happen unless you can sync their sound cards via SPDIF or word clock. But that's real time. Because there is no way to know what the 'logical time' is outside of your logical frame, just use the sequential block number as your logical time. Pack a sequence number followed by a blob, possibly resetting the sequence numbers when they get too big. No need for bundle or timetag.
Martin