[linux-audio-dev] anaheim
Tim Hockin
thockin at hockin.org
Wed Jan 15 06:04:00 UTC 2003
> assuming i can book one, i would appreciate it if tim (hockin) could
How does this look for a start? Please send me fixes and missing topics.
Keep in mind this is an OVERVIEW doc, not a full API guide. :)
Tim (it's 3:00 am - goodnight!)
The XAP Audio Pluing API
An Overview
$Id: xap_overview.txt,v 1.1 2003/01/15 10:55:50 thockin Exp $
Guilty Parties
----
XAP is a combined effort of many people on the linux-audio-dev
(linux-audio-dev at music.columbia.edu) mailing list. The discussion is
open, and anyone interested is welcome to join in.
Goals
----
The main goal of this API is to provide an API that is full-featured
enough to be the primary plugin system for audio creation and playback
applications, while remaining as simple, lightweight, and self-contained
as possible.
Terminology
----
* Plugin:
A chunk of code, loaded or not, that implements this API (e.g. a .so
file or a running instance).
* Host
The program responsible for loading and controlling Plugins.
* Instrument/Source:
An instance of a Plugin that supports the instrument API and is used
to generate audio signals. Many Instruments will implement audio
output but not input, though they may support both and be used an an
Effect, too.
* Effect:
An instance of a Plugin that supports both audio input and output.
* Output/Sink:
An instance of a Plugin that can act as a terminator for a chain of
Plugins. Many Outputs will will support audio input but not output,
though they may support both and be used as an Effect, too.
* Voice:
A playing sound within an Instrument. Instruments may have multiple
Voices, or only one Voice. A Voice may be silent but still active.
* Event:
A time-stamped notification of some change of something.
* Control:
A knob, button, slider, or virtual thing that modifies behavior of
the Plugin. Controls can be master (e.g. master volume),
per-Channel (e.g. channel pressure) or per-Voice (e.g. aftertouch).
* Port:
An audio input or output.
//FIXME: some big ones are missing: VVID, Channel, EventQueue, Tick,
// Cuepoint
Overview
----
Plugins are loaded from shared object files. A shared object file holds
one or more plugin descriptors, accessed by index. Each descriptor holds
all the information about a single plugin - it's identification,
capabilities, controls, and access methods.
XAP plugins are always in one of two states - ACTIVE or INACTIVE. Hosts
load Plugins, instantiate them, establish Port and EventQueue connections,
and activate them. Once active, a Plugin expects to be run repeatedly on
small blocks of data.
Events
----
Almost everything that happens during the ACTIVE state is communicated via
Events. The Host can send Events to Plugins, Plugins can send Events to
the Host, and Plugins can send Events to other Plugins (if they are so
connected).
XAP hosts have a running timer (unsigned) which counts sample-frames since
some arbitrary start point. The start point is irrelevant, only the
passing of audio-time matters. All Events are time-stamped, giving XAP
plugins sample-accurate handling of events.
Controls
----
XAP uses Controls as abstract carriers of Plugin parameters and other
information. Controls are the way Events are transferred. Controls can
represent things like knobs and buttons, but they can also represent
things like MIDI-compatible aftertouch or channel pressure. Not only do
they represent audio parameters, but they can represent chunks of system
information, such as tempo or transport position.
Controls come in a few datatype flavors, and have min/max limits and
default values, as well as hints to the host about what they are.
Tempo and Meter
----
XAP uses Controls for transmitting tempo and meter information. If a
Plugin defines a TEMPO control, it can expect to receive tempo events on
that control. The Host must define some unit of measurement, a Tick,
which represents the smalles granularity the host wants to work with.
This is the basis for tempo and meter.
Control: TEMPO
Type: double
Units: ticks/sec
Range: [-inf, inf]
Events: Hosts must send a TEMPO Event at Plugin init and when tempo
changes.
Control: METER
Type: double
Units: ticks/measure
Range: [0.0, inf]
Events: Hosts must send a METER Event at Plugin init and when meter
changes. Hosts should send a METER Event periodically, such as
every measure or once per second.
Control: METERBASE
Type: double
Units: beats/whole-note
Range: [1.0, inf]
Events: Hosts must send a METERBASE Event at Plugin init and when meter
changes.
Sequencer Control
----
XAP plugins may be aware of certain sequencer events, such as transport
changes, positional jumps., and loop-points. These data are received on
Controls.
Control: POSITION
Type: double
Units: ticks
Range: [0.0, inf]
Events: Hosts must send a POSITION Event at Plugin init, when transport
starts, and when transport jumps. Hosts should send a POSITION
Event periodically, such as every beat, every measure or once per
second.
Control: TRANSPORT
Type: bool
Units: on/off
Events: Hosts must send a TRANSPORT Event at Plugin init and when
transport state changes.
Control: CUEPOINT
Type: double
Units: ticks
Range: [0.0, inf]
Events: Hosts must send a CUEPOINT Event when Cuepoints are added,
changed, or removed.
Control: SPEED
Type: double
Units: scalar
Range: [-inf, inf]
Events: Hosts must send a SPEED Event at Plugin init and when play speed
changes.
//FIXME: Voices and VVIDS
//FIXME: Event types?
//FIXME: Control types?
//FIXME: Host call backs
//FIXME: Time conversion
//FIXME: Threading
//FIXME: RT
//FIXME: Channels
//FIXME: MIDI
More information about the Linux-audio-dev
mailing list