Mercurial > hg > svcore
diff plugin/api/new_dssi_transport_patch @ 0:da6937383da8
initial import
author | Chris Cannam |
---|---|
date | Tue, 10 Jan 2006 16:33:16 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plugin/api/new_dssi_transport_patch Tue Jan 10 16:33:16 2006 +0000 @@ -0,0 +1,245 @@ +diff -r dssi-CVS-20051012=0.9.1/dssi/dssi.h _dssi-transport-mine-new/dssi/dssi.h +5,6c5,6 +< DSSI version 0.9 +< Copyright (c) 2004 Chris Cannam, Steve Harris and Sean Bolton +--- +> DSSI version 0.10 +> Copyright (c) 2004,2005 Chris Cannam, Steve Harris and Sean Bolton +30c30 +< #define DSSI_VERSION "0.9" +--- +> #define DSSI_VERSION "0.10" +32c32 +< #define DSSI_VERSION_MINOR 9 +--- +> #define DSSI_VERSION_MINOR 10 +76a77,152 +> #define DSSI_TRANSPORT_VALID_STATE 0x01 +> #define DSSI_TRANSPORT_VALID_BPM 0x02 +> #define DSSI_TRANSPORT_VALID_BBT 0x10 +> #define DSSI_TRANSPORT_VALID_TIME 0x20 +> +> #define DSSI_TRANSPORT_STATE_STOPPED 0 +> #define DSSI_TRANSPORT_STATE_RUNNING 1 +> #define DSSI_TRANSPORT_STATE_FREEWHEELING 2 +> #define DSSI_TRANSPORT_STATE_OTHER 3 /* waiting for sync, ? */ +> +> typedef struct _DSSI_Transport_Info { +> +> /** The value of this field indicates which of the following +> * transport information fields contain valid values. It is +> * the logical OR of the DSSI_TRANSPORT_VALID_* bits defined +> * above, and may be zero. */ +> int Valid; +> +> +> /** This field is valid when (Valid & DSSI_TRANSPORT_VALID_STATE) +> * is true: +> * +> * ---- The current transport state, one of the DSSI_TRANSPORT_STATE_* +> * values defined above. */ +> int State; +> +> +> /** This field is valid when (Valid & DSSI_TRANSPORT_VALID_BPM) +> * is true: +> * +> * ---- The current tempo, in beats per minute. */ +> double Beats_Per_Minute; +> +> +> /** These six fields are valid when (Valid & DSSI_TRANSPORT_VALID_BBT) +> * is true: +> * +> * ---- The bar number at the beginning of the current process cycle. */ +> unsigned long Bar; +> +> * ---- The beat within that Bar. */ +> unsigned long Beat; +> +> /** ---- The tick within that Beat. */ +> unsigned long Tick; +> +> /** ---- The (possibly fractional) tick count since transport 'start' +> * and the beginning of the current Bar. */ +> double Bar_Start_Tick; +> +> /** ---- The number of beats per bar. */ +> float Beats_Per_Bar; +> +> /** ---- The number of ticks for each beat. */ +> double Ticks_Per_Beat; +> +> /* [Sean says: I left out the 'beat_type' (time signature "denominator") +> * field of the jack_position_t structure, because I think it's useless +> * except to a notation program. Does anybody else feel like we need it?] +> +> +> /** These two fields are valid when (Valid & DSSI_TRANSPORT_VALID_TIME) +> * is true: +> * +> * ---- The transport time at the beginning of the current process +> * cycle, in seconds. */ +> double Current_Time; +> +> /** ---- The transport time at the beginning of the next process +> cycle, unless repositioning occurs. */ +> double Next_Time; +> +> } DSSI_Transport_Info; +> +> typedef struct _DSSI_Host_Descriptor DSSI_Host_Descriptor; /* below */ +> +83,84c159,161 +< * If we're lucky, this will never be needed. For now all plugins +< * must set it to 1. +--- +> * All plugins must set this to 1 or 2. The version 1 API contains +> * all DSSI_Descriptor fields through run_multiple_synths_adding(), +> * while the version 2 API adds the receive_host_descriptor(). +376a454,472 +> +> /** +> * receive_host_descriptor() +> * +> * This member is a function pointer by which a host may provide +> * a plugin with a pointer to its DSSI_Host_Descriptor. Hosts +> * which provide host descriptor support must call this function +> * once per plugin shared object file, before any calls to +> * instantiate(). +> * +> * NOTE: This field was added in version 2 of the DSSI API. Hosts +> * supporting version 2 must not access this field in a plugin +> * whose DSSI_API_Version is 1, and plugins supporting version 2 +> * should behave reasonably under hosts (of any version) which do +> * not implement this function. A version 2 plugin that does not +> * provide this function must set this member to NULL. +> */ +> void (*receive_host_descriptor)(DSSI_Host_Descriptor *Descriptor); +> +377a474,598 +> +> struct _DSSI_Host_Descriptor { +> +> /** +> * DSSI_API_Version +> * +> * This member indicates the DSSI API level used by this host. +> * All hosts must set this to 2. Hopefully, we'll get this right +> * the first time, and this will never be needed. +> */ +> int DSSI_API_Version; +> +> /** +> * request_tranport_information() +> * +> * This member is a function pointer by which a plugin instance may +> * request that a host begin providing transport information (if +> * Request is non-zero), or notify the host that it no longer needs +> * transport information (if Request is zero). Upon receiving a +> * non-zero request, the host should return a pointer to a +> * DSSI_Transport_Info structure if it is able to provide transport +> * information, or NULL otherwise. +> * +> * Once a plugin instance has received a non-null transport +> * information pointer, it may read from the structure at any time +> * within the execution of an audio class function (see doc/RFC.txt). +> * It should not consider the structure contents to be meaningful +> * while within a instantiation or control class function. Also, +> * since the validity of fields within the structure may change +> * between each new invocation of an audio class function, a plugin +> * instance must check the Valid field of the structure accordingly +> * before using the structure's other contents. +> * +> * A host which does not support this function must set this member +> * to NULL. +> */ +> DSSI_Transport_Info * +> (*request_transport_information)(LADSPA_Handle Instance, +> int Request); +> +> /** +> * request_midi_send() +> * +> * This member is a function pointer that allows a plugin to +> * request the ability to send MIDI events to the host. +> * +> * While the interpretation of plugin-generated MIDI events is +> * host implementation specific, a mechanism exists by which a +> * plugin may declare to the host the number of destination +> * 'ports' and MIDI channels it can expect will be used in the +> * plugin-generated events. Plugins which generate unchannelized +> * MIDI should supply zero for both Ports and Channels, otherwise +> * they should supply the maximum numbers for Ports and Channels +> * they expect to use. +> * +> * A plugin instance must call this function during instantiate(). +> * [Sean says: this restriction seems reasonable to me, since +> * the host may need to create output ports, etc., and instantiate() +> * seems like a good place to do such things. I'm sure I haven't +> * fully thought through all the details, though....] +> * +> * The host should return a non-zero value if it is able to +> * provide MIDI send for the plugin instance, otherwise it should +> * return zero, and the plugin instance may not subsequently call +> * midi_send(). +> * +> * A host which does not support the MIDI send function must set +> * both this member and (*midi_send)() below to NULL. +> */ +> int (*request_midi_send)(LADSPA_Handle Instance, +> unsigned char Ports, +> unsigned char Channels); +> +> /** +> * midi_send() +> * +> * This member is a function pointer by which a plugin actually +> * sends MIDI events to the host (provided it has received a non- +> * zero return from request_midi_send()). As in the run_synth() +> * functions, the Event pointer points to a block of EventCount +> * ALSA sequencer events. The dest.port and data.*.channel fields +> * of each event are used to specify destination port and channel, +> * respectively, when the plugin is supplying channelized events. +> * +> * A plugin may only call this function from within the execution +> * of the audio class run_*() or select_program() functions. When +> * called from a run_*() functions, the events are timestamped +> * relative to the start of the block, (mis)using the ALSA "tick +> * time" field as a frame count. The plugin is responsible for +> * ensuring that events with differing timestamps are already +> * ordered by time, and that timestamps across multiple calls to +> * midi_send() from within the same run_*() invocation are +> * monotonic. When midi_send() is called from within +> * select_program(), the timestamps are ignored, and the events +> * are considered to originate at the same frame time as the +> * select_program() call, if such a timing can be considered +> * meaningful. +> * +> * The memory pointed to by Event belongs to the plugin, and it is +> * the host's responsibility to copy the events as needed before +> * returning from the midi_send() call. +> * +> * A host which does not support the MIDI send function must set +> * both this member and (*request_midi_send)() above to NULL. +> */ +> void (*midi_send)(LADSPA_Handle Instance, +> snd_seq_event_t *Event, +> unsigned long EventCount); +> +> /** +> * . . . additional fields could follow here, possibly supporting: +> * +> * - a facility by which a plugin instance may request from a +> * host a non-realtime thread in which to do off-line +> * rendering, I/O, etc., thus (hopefully) avoiding the +> * crashes that seem to occur when plugins create their own +> * threads. I got this idea after noticing that ZynAddSubFX +> * achieves its gorgeous textures while remaining very +> * responsive by doing a lot of non-real-time rendering. +> * Several other uses for it have been mentioned on the DSSI +> * list; I forget what. +> * +> * - per-voice audio output +> */ +> };