|
- /*
- Copyright (C) 2001 Paul Davis
- Copyright (C) 2004 Jack O'Quin
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2.1 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
- */
-
- #ifndef __jack_types_h__
- #define __jack_types_h__
-
- #include <jack/systemdeps.h>
-
- typedef int32_t jack_shmsize_t;
-
- /**
- * Type used to represent sample frame counts.
- */
- typedef uint32_t jack_nframes_t;
-
- /**
- * Maximum value that can be stored in jack_nframes_t
- */
- #define JACK_MAX_FRAMES (4294967295U) /* This should be UINT32_MAX, but C++ has a problem with that. */
-
- /**
- * Type used to represent the value of free running
- * monotonic clock with units of microseconds.
- */
- typedef uint64_t jack_time_t;
-
- /**
- * Maximum size of @a load_init string passed to an internal client
- * jack_initialize() function via jack_internal_client_load().
- */
- #define JACK_LOAD_INIT_LIMIT 1024
-
- /**
- * jack_intclient_t is an opaque type representing a loaded internal
- * client. You may only access it using the API provided in @ref
- * intclient.h "<jack/intclient.h>".
- */
- typedef uint64_t jack_intclient_t;
-
- /**
- * jack_port_t is an opaque type. You may only access it using the
- * API provided.
- */
- typedef struct _jack_port jack_port_t;
-
- /**
- * jack_client_t is an opaque type. You may only access it using the
- * API provided.
- */
- typedef struct _jack_client jack_client_t;
-
- /**
- * Ports have unique ids. A port registration callback is the only
- * place you ever need to know their value.
- */
- typedef uint32_t jack_port_id_t;
-
- typedef uint32_t jack_port_type_id_t;
-
- /**
- * Prototype for the client supplied function that is called
- * by the engine anytime there is work to be done.
- *
- * @pre nframes == jack_get_buffer_size()
- * @pre nframes == pow(2,x)
- *
- * @param nframes number of frames to process
- * @param arg pointer to a client supplied structure
- *
- * @return zero on success, non-zero on error
- */
- typedef int (*JackProcessCallback)(jack_nframes_t nframes, void *arg);
-
- /**
- * Prototype for the client thread routine called
- * by the engine when the client is inserted in the graph.
- *
- * @param arg pointer to a client supplied structure
- *
- */
- typedef void *(*JackThreadCallback)(void* arg);
-
- /**
- * Prototype for the client supplied function that is called
- * once after the creation of the thread in which other
- * callbacks will be made. Special thread characteristics
- * can be set from this callback, for example. This is a
- * highly specialized callback and most clients will not
- * and should not use it.
- *
- * @param arg pointer to a client supplied structure
- *
- * @return void
- */
- typedef void (*JackThreadInitCallback)(void *arg);
-
- /**
- * Prototype for the client supplied function that is called
- * whenever the processing graph is reordered.
- *
- * @param arg pointer to a client supplied structure
- *
- * @return zero on success, non-zero on error
- */
- typedef int (*JackGraphOrderCallback)(void *arg);
-
- /**
- * Prototype for the client-supplied function that is called whenever
- * an xrun has occured.
- *
- * @see jack_get_xrun_delayed_usecs()
- *
- * @param arg pointer to a client supplied structure
- *
- * @return zero on success, non-zero on error
- */
- typedef int (*JackXRunCallback)(void *arg);
-
- /**
- * Prototype for the @a bufsize_callback that is invoked whenever the
- * JACK engine buffer size changes. Although this function is called
- * in the JACK process thread, the normal process cycle is suspended
- * during its operation, causing a gap in the audio flow. So, the @a
- * bufsize_callback can allocate storage, touch memory not previously
- * referenced, and perform other operations that are not realtime
- * safe.
- *
- * @param nframes buffer size
- * @param arg pointer supplied by jack_set_buffer_size_callback().
- *
- * @return zero on success, non-zero on error
- */
- typedef int (*JackBufferSizeCallback)(jack_nframes_t nframes, void *arg);
-
- /**
- * Prototype for the client supplied function that is called
- * when the engine sample rate changes.
- *
- * @param nframes new engine sample rate
- * @param arg pointer to a client supplied structure
- *
- * @return zero on success, non-zero on error
- */
- typedef int (*JackSampleRateCallback)(jack_nframes_t nframes, void *arg);
-
- /**
- * Prototype for the client supplied function that is called
- * whenever a port is registered or unregistered.
- *
- * @param arg pointer to a client supplied structure
- */
- typedef void (*JackPortRegistrationCallback)(jack_port_id_t port, int, void *arg);
-
- /**
- * Prototype for the client supplied function that is called
- * whenever a client is registered or unregistered.
- *
- * @param name a null-terminated string containing the client name
- * @param register non-zero if the client is being registered,
- * zero if the client is being unregistered
- * @param arg pointer to a client supplied structure
- */
- typedef void (*JackClientRegistrationCallback)(const char* name, int val, void *arg);
-
- /**
- * Prototype for the client supplied function that is called
- * whenever a port is connected or disconnected.
- *
- * @param a one of two ports connected or disconnected
- * @param b one of two ports connected or disconnected
- * @param connect non-zero if ports were connected
- * zero if ports were disconnected
- * @param arg pointer to a client supplied data
- */
- typedef void (*JackPortConnectCallback)(jack_port_id_t a, jack_port_id_t b, int connect, void* arg);
-
- /**
- * Prototype for the client supplied function that is called
- * whenever the port name has been changed.
- *
- * @param port the port that has been renamed
- * @param new_name the new name
- * @param arg pointer to a client supplied structure
- *
- * @return zero on success, non-zero on error
- */
- typedef int (*JackPortRenameCallback)(jack_port_id_t port, const char* old_name, const char* new_name, void *arg);
-
- /**
- * Prototype for the client supplied function that is called
- * whenever jackd starts or stops freewheeling.
- *
- * @param starting non-zero if we start starting to freewheel, zero otherwise
- * @param arg pointer to a client supplied structure
- */
- typedef void (*JackFreewheelCallback)(int starting, void *arg);
-
- /**
- * Prototype for the client supplied function that is called
- * whenever jackd is shutdown. Note that after server shutdown,
- * the client pointer is *not* deallocated by libjack,
- * the application is responsible to properly use jack_client_close()
- * to release client ressources. Warning: jack_client_close() cannot be
- * safely used inside the shutdown callback and has to be called outside of
- * the callback context.
- *
- * @param arg pointer to a client supplied structure
- */
- typedef void (*JackShutdownCallback)(void *arg);
-
- /**
- * Used for the type argument of jack_port_register() for default
- * audio ports and midi ports.
- */
- #define JACK_DEFAULT_AUDIO_TYPE "32 bit float mono audio"
- #define JACK_DEFAULT_MIDI_TYPE "8 bit raw midi"
-
- /**
- * For convenience, use this typedef if you want to be able to change
- * between float and double. You may want to typedef sample_t to
- * jack_default_audio_sample_t in your application.
- */
- typedef float jack_default_audio_sample_t;
-
- /**
- * A port has a set of flags that are formed by AND-ing together the
- * desired values from the list below. The flags "JackPortIsInput" and
- * "JackPortIsOutput" are mutually exclusive and it is an error to use
- * them both.
- */
- enum JackPortFlags {
-
- /**
- * if JackPortIsInput is set, then the port can receive
- * data.
- */
- JackPortIsInput = 0x1,
-
- /**
- * if JackPortIsOutput is set, then data can be read from
- * the port.
- */
- JackPortIsOutput = 0x2,
-
- /**
- * if JackPortIsPhysical is set, then the port corresponds
- * to some kind of physical I/O connector.
- */
- JackPortIsPhysical = 0x4,
-
- /**
- * if JackPortCanMonitor is set, then a call to
- * jack_port_request_monitor() makes sense.
- *
- * Precisely what this means is dependent on the client. A typical
- * result of it being called with TRUE as the second argument is
- * that data that would be available from an output port (with
- * JackPortIsPhysical set) is sent to a physical output connector
- * as well, so that it can be heard/seen/whatever.
- *
- * Clients that do not control physical interfaces
- * should never create ports with this bit set.
- */
- JackPortCanMonitor = 0x8,
-
- /**
- * JackPortIsTerminal means:
- *
- * for an input port: the data received by the port
- * will not be passed on or made
- * available at any other port
- *
- * for an output port: the data available at the port
- * does not originate from any other port
- *
- * Audio synthesizers, I/O hardware interface clients, HDR
- * systems are examples of clients that would set this flag for
- * their ports.
- */
- JackPortIsTerminal = 0x10,
-
- /**
- * JackPortIsActive means the port has been registered and the
- * client is "active", that is jack_activate has been called
- *
- * JackPortIsActive is on between jack_activate and jack_deactivate.
- */
- JackPortIsActive = 0x20
- };
-
- /**
- * @ref jack_options_t bits
- */
- enum JackOptions {
-
- /**
- * Null value to use when no option bits are needed.
- */
- JackNullOption = 0x00,
-
- /**
- * Do not automatically start the JACK server when it is not
- * already running. This option is always selected if
- * \$JACK_NO_START_SERVER is defined in the calling process
- * environment.
- */
- JackNoStartServer = 0x01,
-
- /**
- * Use the exact client name requested. Otherwise, JACK
- * automatically generates a unique one, if needed.
- */
- JackUseExactName = 0x02,
-
- /**
- * Open with optional <em>(char *) server_name</em> parameter.
- */
- JackServerName = 0x04,
-
- /**
- * Load internal client from optional <em>(char *)
- * load_name</em>. Otherwise use the @a client_name.
- */
- JackLoadName = 0x08,
-
- /**
- * Pass optional <em>(char *) load_init</em> string to the
- * jack_initialize() entry point of an internal client.
- */
- JackLoadInit = 0x10,
-
- /**
- * pass a SessionID Token this allows the sessionmanager to identify the client again.
- */
- JackSessionID = 0x20
- };
-
- /** Valid options for opening an external client. */
- #define JackOpenOptions (JackSessionID|JackServerName|JackNoStartServer|JackUseExactName)
-
- /** Valid options for loading an internal client. */
- #define JackLoadOptions (JackLoadInit|JackLoadName|JackUseExactName)
-
- /**
- * Options for several JACK operations, formed by OR-ing together the
- * relevant @ref JackOptions bits.
- */
- typedef enum JackOptions jack_options_t;
-
- /**
- * @ref jack_status_t bits
- */
- enum JackStatus {
-
- /**
- * Overall operation failed.
- */
- JackFailure = 0x01,
-
- /**
- * The operation contained an invalid or unsupported option.
- */
- JackInvalidOption = 0x02,
-
- /**
- * The desired client name was not unique. With the @ref
- * JackUseExactName option this situation is fatal. Otherwise,
- * the name was modified by appending a dash and a two-digit
- * number in the range "-01" to "-99". The
- * jack_get_client_name() function will return the exact string
- * that was used. If the specified @a client_name plus these
- * extra characters would be too long, the open fails instead.
- */
- JackNameNotUnique = 0x04,
-
- /**
- * The JACK server was started as a result of this operation.
- * Otherwise, it was running already. In either case the caller
- * is now connected to jackd, so there is no race condition.
- * When the server shuts down, the client will find out.
- */
- JackServerStarted = 0x08,
-
- /**
- * Unable to connect to the JACK server.
- */
- JackServerFailed = 0x10,
-
- /**
- * Communication error with the JACK server.
- */
- JackServerError = 0x20,
-
- /**
- * Requested client does not exist.
- */
- JackNoSuchClient = 0x40,
-
- /**
- * Unable to load internal client
- */
- JackLoadFailure = 0x80,
-
- /**
- * Unable to initialize client
- */
- JackInitFailure = 0x100,
-
- /**
- * Unable to access shared memory
- */
- JackShmFailure = 0x200,
-
- /**
- * Client's protocol version does not match
- */
- JackVersionError = 0x400,
-
- /**
- * Backend error
- */
- JackBackendError = 0x800,
-
- /**
- * Client zombified failure
- */
- JackClientZombie = 0x1000
- };
-
- /**
- * Status word returned from several JACK operations, formed by
- * OR-ing together the relevant @ref JackStatus bits.
- */
- typedef enum JackStatus jack_status_t;
-
- /**
- * Transport states.
- */
- typedef enum {
-
- /* the order matters for binary compatibility */
- JackTransportStopped = 0, /**< Transport halted */
- JackTransportRolling = 1, /**< Transport playing */
- JackTransportLooping = 2, /**< For OLD_TRANSPORT, now ignored */
- JackTransportStarting = 3, /**< Waiting for sync ready */
- JackTransportNetStarting = 4, /**< Waiting for sync ready on the network*/
-
- } jack_transport_state_t;
-
- typedef uint64_t jack_unique_t; /**< Unique ID (opaque) */
-
- /**
- * Optional struct jack_position_t fields.
- */
- typedef enum {
-
- JackPositionBBT = 0x10, /**< Bar, Beat, Tick */
- JackPositionTimecode = 0x20, /**< External timecode */
- JackBBTFrameOffset = 0x40, /**< Frame offset of BBT information */
- JackAudioVideoRatio = 0x80, /**< audio frames per video frame */
- JackVideoFrameOffset = 0x100 /**< frame offset of first video frame */
-
- } jack_position_bits_t;
-
- /** all valid position bits */
- #define JACK_POSITION_MASK (JackPositionBBT|JackPositionTimecode)
- #define EXTENDED_TIME_INFO
-
- typedef struct {
-
- /* these four cannot be set from clients: the server sets them */
- jack_unique_t unique_1; /**< unique ID */
- jack_time_t usecs; /**< monotonic, free-rolling */
- jack_nframes_t frame_rate; /**< current frame rate (per second) */
- jack_nframes_t frame; /**< frame number, always present */
-
- jack_position_bits_t valid; /**< which other fields are valid */
-
- /* JackPositionBBT fields: */
- int32_t bar; /**< current bar */
- int32_t beat; /**< current beat-within-bar */
- int32_t tick; /**< current tick-within-beat */
- double bar_start_tick;
-
- float beats_per_bar; /**< time signature "numerator" */
- float beat_type; /**< time signature "denominator" */
- double ticks_per_beat;
- double beats_per_minute;
-
- /* JackPositionTimecode fields: (EXPERIMENTAL: could change) */
- double frame_time; /**< current time in seconds */
- double next_time; /**< next sequential frame_time
- (unless repositioned) */
-
- /* JackBBTFrameOffset fields: */
- jack_nframes_t bbt_offset; /**< frame offset for the BBT fields
- (the given bar, beat, and tick
- values actually refer to a time
- frame_offset frames before the
- start of the cycle), should
- be assumed to be 0 if
- JackBBTFrameOffset is not
- set. If JackBBTFrameOffset is
- set and this value is zero, the BBT
- time refers to the first frame of this
- cycle. If the value is positive,
- the BBT time refers to a frame that
- many frames before the start of the
- cycle. */
-
- /* JACK video positional data (experimental) */
-
- float audio_frames_per_video_frame; /**< number of audio frames
- per video frame. Should be assumed
- zero if JackAudioVideoRatio is not
- set. If JackAudioVideoRatio is set
- and the value is zero, no video
- data exists within the JACK graph */
-
- jack_nframes_t video_offset; /**< audio frame at which the first video
- frame in this cycle occurs. Should
- be assumed to be 0 if JackVideoFrameOffset
- is not set. If JackVideoFrameOffset is
- set, but the value is zero, there is
- no video frame within this cycle. */
-
- /* For binary compatibility, new fields should be allocated from
- * this padding area with new valid bits controlling access, so
- * the existing structure size and offsets are preserved. */
- int32_t padding[7];
-
- /* When (unique_1 == unique_2) the contents are consistent. */
- jack_unique_t unique_2; /**< unique ID */
-
- } jack_position_t;
-
- /**
- * Prototype for the @a sync_callback defined by slow-sync clients.
- * When the client is active, this callback is invoked just before
- * process() in the same thread. This occurs once after registration,
- * then subsequently whenever some client requests a new position, or
- * the transport enters the ::JackTransportStarting state. This
- * realtime function must not wait.
- *
- * The transport @a state will be:
- *
- * - ::JackTransportStopped when a new position is requested;
- * - ::JackTransportStarting when the transport is waiting to start;
- * - ::JackTransportRolling when the timeout has expired, and the
- * position is now a moving target.
- *
- * @param state current transport state.
- * @param pos new transport position.
- * @param arg the argument supplied by jack_set_sync_callback().
- *
- * @return TRUE (non-zero) when ready to roll.
- */
- typedef int (*JackSyncCallback)(jack_transport_state_t state,
- jack_position_t *pos,
- void *arg);
-
-
- /**
- * Prototype for the @a timebase_callback used to provide extended
- * position information. Its output affects all of the following
- * process cycle. This realtime function must not wait.
- *
- * This function is called immediately after process() in the same
- * thread whenever the transport is rolling, or when any client has
- * requested a new position in the previous cycle. The first cycle
- * after jack_set_timebase_callback() is also treated as a new
- * position, or the first cycle after jack_activate() if the client
- * had been inactive.
- *
- * The timebase master may not use its @a pos argument to set @a
- * pos->frame. To change position, use jack_transport_reposition() or
- * jack_transport_locate(). These functions are realtime-safe, the @a
- * timebase_callback can call them directly.
- *
- * @param state current transport state.
- * @param nframes number of frames in current period.
- * @param pos address of the position structure for the next cycle; @a
- * pos->frame will be its frame number. If @a new_pos is FALSE, this
- * structure contains extended position information from the current
- * cycle. If TRUE, it contains whatever was set by the requester.
- * The @a timebase_callback's task is to update the extended
- * information here.
- * @param new_pos TRUE (non-zero) for a newly requested @a pos, or for
- * the first cycle after the @a timebase_callback is defined.
- * @param arg the argument supplied by jack_set_timebase_callback().
- */
- typedef void (*JackTimebaseCallback)(jack_transport_state_t state,
- jack_nframes_t nframes,
- jack_position_t *pos,
- int new_pos,
- void *arg);
-
- /*********************************************************************
- * The following interfaces are DEPRECATED. They are only provided
- * for compatibility with the earlier JACK transport implementation.
- *********************************************************************/
-
- /**
- * Optional struct jack_transport_info_t fields.
- *
- * @see jack_position_bits_t.
- */
- typedef enum {
-
- JackTransportState = 0x1, /**< Transport state */
- JackTransportPosition = 0x2, /**< Frame number */
- JackTransportLoop = 0x4, /**< Loop boundaries (ignored) */
- JackTransportSMPTE = 0x8, /**< SMPTE (ignored) */
- JackTransportBBT = 0x10 /**< Bar, Beat, Tick */
-
- } jack_transport_bits_t;
-
- /**
- * Deprecated struct for transport position information.
- *
- * @deprecated This is for compatibility with the earlier transport
- * interface. Use the jack_position_t struct, instead.
- */
- typedef struct {
-
- /* these two cannot be set from clients: the server sets them */
-
- jack_nframes_t frame_rate; /**< current frame rate (per second) */
- jack_time_t usecs; /**< monotonic, free-rolling */
-
- jack_transport_bits_t valid; /**< which fields are legal to read */
- jack_transport_state_t transport_state;
- jack_nframes_t frame;
- jack_nframes_t loop_start;
- jack_nframes_t loop_end;
-
- long smpte_offset; /**< SMPTE offset (from frame 0) */
- float smpte_frame_rate; /**< 29.97, 30, 24 etc. */
-
- int bar;
- int beat;
- int tick;
- double bar_start_tick;
-
- float beats_per_bar;
- float beat_type;
- double ticks_per_beat;
- double beats_per_minute;
-
- } jack_transport_info_t;
-
- /**
- * Prototype for the client supplied function that is called
- * whenever jackd is shutdown. Note that after server shutdown,
- * the client pointer is *not* deallocated by libjack,
- * the application is responsible to properly use jack_client_close()
- * to release client ressources. Warning: jack_client_close() cannot be
- * safely used inside the shutdown callback and has to be called outside of
- * the callback context.
-
- * @param code a status word, formed by OR-ing together the relevant @ref JackStatus bits.
- * @param reason a string describing the shutdown reason (backend failure, server crash... etc...)
- * @param arg pointer to a client supplied structure
- */
- typedef void (*JackInfoShutdownCallback)(jack_status_t code, const char* reason, void *arg);
-
- #endif /* __jack_types_h__ */
|