On Tue, Jun 5, 2012 at 3:44 PM, David Robillard <d@drobilla.net> wrote:
On Tue, 2012-06-05 at 06:34 -0400, Jeremy Salwen wrote:
> Hi All,
>
> From what I can tell, it looks like the LV2 Atom Sequence
> specification allows you to send events with arbitrary units for the
> timestamp.
>
> I have a few questions about this:
>
> 1. How are we to know whether a particular unit uses the double field
> in the timestamp union, or the uint64_t field in the timestamp union.

Context.  When used as event ports in the run() callback, it is always
frames, like everything else.

I deliberately avoided complicating it with a bunch of stuff to handle
beat-based time stamps in this context since this would almost certainly
be unused (learned that lesson with the event extension).  It can be
added later if need be.

> 2. The specification says "The unit field is either a URID that
> described an appropriate time stamp type, or may be 0 where a default
> stamp type is known."  In what circumstances would the timestamp be
> known?  When can I expect to see a zero in that field?

See above.

> 3. Are the timestamps absolute times?  Or relative to the previous
> event?  Or relative to the start of the audio chunk? Does it depend on
> the units used?

Absolute from the start of the Sequence.

> 4. Why does the documentation show |FRAMES |SUBFRMS| as the timestamp
> field? From what I can tell, there is no unit which includes frames
> and subframes subdivided that way, and the sampler example just uses
> the full 64 bits as a frames field.  Is this just a relic from the old
> event port documentation? (the diagram seems familiar).

Oops, relic.  I will fix this.

> 5. How are hosts/plugins supposed to deal with the multiplicity of
> units?  For example, suppose I'm a plugin or host that wants to
> receive MIDI data. How am I supposed to know what timestamp unit to
> expect?  Is there a facility for converting between different units
> automatically?  The only extra information required to convert between
> any two time units would be the bpm and sample rate.  It would be
> rather annoying to have to implement a bunch of unit conversion code
> in every host/plugin you write in order to make sure it can handle any
> unit which is tossed at it.

Indeed it would be.  Hence why none of this is there, so the extension
does not imply you are expected to have to deal with any of that.  I
suppose the fact that it is audio frames in this context needs to be
more clear.

In short, when used as port buffers, it's always frames, don't worry
about it.  The potential for other time stamp types is there for other
cases, since it's possible to use Sequences in other non-port-buffer
ways (e.g. you could send around events with entire sequences as their
payloads)

Cheers,

-dr

P.S. lv2-dev is a better place for this sort of thing

Thanks David,

If the timestamps are absolute, are they reset on every call to activate()?

I thought lv2-dev was for developing the lv2 spec and extensions, but my questions were more about implementation of plugins/hosts.

Jeremy