On Tue, Jun 5, 2012 at 3:44 PM, David Robillard <d(a)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