2022-10-06 04:18:57 +02:00
|
|
|
# jacket.nim
|
|
|
|
|
|
|
|
|
2022-10-09 09:13:05 +02:00
|
|
|
# Possible names/install locations of libjack, according to:
|
2022-10-06 04:18:57 +02:00
|
|
|
# https://github.com/x42/weakjack/blob/master/weak_libjack.c#L108
|
|
|
|
proc getJackLibName: string =
|
|
|
|
when system.hostOS == "windows":
|
2022-10-09 09:13:05 +02:00
|
|
|
when sizeof(int) == 4:
|
|
|
|
result = "libjack.dll"
|
|
|
|
else:
|
|
|
|
result = "libjack64.dll"
|
2022-10-06 04:18:57 +02:00
|
|
|
elif system.hostOS == "macosx":
|
2022-10-09 09:13:05 +02:00
|
|
|
result = "(|/usr/local/lib/|/opt/homebrew/lib/|/opt/local/lib/)libjack.dylib"
|
2022-10-06 04:18:57 +02:00
|
|
|
else:
|
|
|
|
result = "libjack.so.0"
|
|
|
|
|
|
|
|
{.push dynlib: getJackLibName().}
|
2023-05-22 04:00:07 +02:00
|
|
|
|
2022-10-09 09:13:05 +02:00
|
|
|
# ------------------------------ Constants --------------------------------
|
|
|
|
|
2022-10-06 04:18:57 +02:00
|
|
|
const
|
|
|
|
JACK_MAX_FRAMES* = (4294967295'i64)
|
|
|
|
JACK_LOAD_INIT_LIMIT* = 1024
|
|
|
|
JACK_DEFAULT_AUDIO_TYPE* = "32 bit float mono audio"
|
|
|
|
JACK_DEFAULT_MIDI_TYPE* = "8 bit raw midi"
|
|
|
|
|
|
|
|
# ----------------------------- Custom Types ------------------------------
|
|
|
|
|
|
|
|
type
|
2023-05-22 05:13:31 +02:00
|
|
|
Time* = culonglong
|
|
|
|
NFrames* = culong
|
|
|
|
Uuid* = culonglong
|
|
|
|
PortId* = culong
|
|
|
|
PortTypeId* = culong
|
|
|
|
DefaultAudioSample* = cfloat
|
2022-10-06 04:18:57 +02:00
|
|
|
|
|
|
|
type
|
2023-05-22 05:13:31 +02:00
|
|
|
Client = distinct object
|
|
|
|
ClientP* = ptr Client
|
|
|
|
Port = distinct object
|
|
|
|
PortP* = ptr Port
|
2022-10-06 04:18:57 +02:00
|
|
|
|
2023-05-22 07:09:35 +02:00
|
|
|
type
|
|
|
|
MidiData* = uint8
|
|
|
|
MidiEvent* = object
|
|
|
|
time*: NFrames
|
|
|
|
size*: csize_t
|
|
|
|
buffer*: ptr UncheckedArray[MidiData]
|
|
|
|
MidiEventP* = ptr MidiEvent
|
|
|
|
|
2022-10-06 04:18:57 +02:00
|
|
|
type
|
|
|
|
JackOptions* {.size: sizeof(cint) pure.} = enum
|
|
|
|
NullOption = 0x00,
|
|
|
|
NoStartServer = 0x01,
|
|
|
|
UseExactName = 0x02,
|
|
|
|
ServerName = 0x04,
|
|
|
|
LoadName = 0x08,
|
|
|
|
LoadInit = 0x10,
|
|
|
|
SessionID = 0x20
|
|
|
|
|
|
|
|
type
|
|
|
|
JackStatus* {.size: sizeof(cint).} = enum
|
2022-10-06 17:24:58 +02:00
|
|
|
Success = 0x00,
|
2022-10-06 04:18:57 +02:00
|
|
|
Failure = 0x01,
|
|
|
|
InvalidOption = 0x02,
|
|
|
|
NameNotUnique = 0x04,
|
|
|
|
ServerStarted = 0x08,
|
|
|
|
ServerFailed = 0x10,
|
|
|
|
ServerError = 0x20,
|
|
|
|
NoSuchClient = 0x40,
|
|
|
|
LoadFailure = 0x80,
|
|
|
|
InitFailure = 0x100,
|
|
|
|
ShmFailure = 0x200,
|
|
|
|
VersionError = 0x400,
|
|
|
|
BackendError = 0x800,
|
|
|
|
ClientZombie = 0x1000
|
|
|
|
|
|
|
|
type
|
|
|
|
JackPortFlags* {.size: sizeof(culong) pure.} = enum
|
|
|
|
PortIsInput = 0x1,
|
|
|
|
PortIsOutput = 0x2,
|
|
|
|
PortIsPhysical = 0x4,
|
|
|
|
PortCanMonitor = 0x8,
|
|
|
|
PortIsTerminal = 0x10
|
|
|
|
|
|
|
|
type
|
|
|
|
JackLatencyCallbackMode* {.size: sizeof(cint) pure.} = enum
|
|
|
|
CaptureLatency,
|
|
|
|
PlaybackLatency
|
|
|
|
|
|
|
|
# Callback function types
|
|
|
|
type
|
2023-05-22 05:13:31 +02:00
|
|
|
JackProcessCallback* = proc (nframes: NFrames; arg: pointer): cint {.cdecl.}
|
2022-10-06 05:10:49 +02:00
|
|
|
JackThreadCallback* = proc (arg: pointer): pointer {.cdecl.}
|
|
|
|
JackThreadInitCallback* = proc (arg: pointer) {.cdecl.}
|
|
|
|
JackGraphOrderCallback* = proc (arg: pointer): cint {.cdecl.}
|
|
|
|
JackXRunCallback* = proc (arg: pointer): cint {.cdecl.}
|
2023-05-22 05:13:31 +02:00
|
|
|
JackBufferSizeCallback* = proc (nframes: NFrames; arg: pointer): cint {.cdecl.}
|
|
|
|
JackSampleRateCallback* = proc (nframes: NFrames; arg: pointer): cint {.cdecl.}
|
|
|
|
JackPortRegistrationCallback* = proc (port: PortId; flag: cint; arg: pointer) {.cdecl.}
|
2022-10-06 05:10:49 +02:00
|
|
|
JackClientRegistrationCallback* = proc (name: cstring; flag: cint; arg: pointer) {.cdecl.}
|
2023-05-22 05:13:31 +02:00
|
|
|
JackPortConnectCallback* = proc (portA: PortId; portB: PortId; connect: cint; arg: pointer) {.cdecl.}
|
|
|
|
JackPortRenameCallback* = proc (port: PortId; oldName: cstring; newName: cstring; arg: pointer) {.cdecl.}
|
2022-10-06 05:10:49 +02:00
|
|
|
JackFreewheelCallback* = proc (starting: cint; arg: pointer) {.cdecl.}
|
|
|
|
JackShutdownCallback* = proc (arg: pointer) {.cdecl.}
|
|
|
|
JackInfoShutdownCallback* = proc (code: JackStatus; reason: cstring; arg: pointer) {.cdecl.}
|
|
|
|
JackLatencyCallback* = proc (mode: JackLatencyCallbackMode; arg: pointer) {.cdecl.}
|
|
|
|
JackInfoCallback* = proc (msg: cstring) {.cdecl.}
|
|
|
|
JackErrorCallback* = proc (msg: cstring) {.cdecl.}
|
2022-10-06 04:18:57 +02:00
|
|
|
|
|
|
|
|
|
|
|
# ----------------------------- Version info ------------------------------
|
|
|
|
|
|
|
|
# void jack_get_version(int *major_ptr, int *minor_ptr, int *micro_ptr, int *proto_ptr) ;
|
|
|
|
proc getVersion*(major: ptr cint; minor: ptr cint; micro: ptr cint; proto: ptr cint) {.importc: "jack_get_version".}
|
|
|
|
|
|
|
|
# const char * jack_get_version_string(void) ;
|
|
|
|
proc getVersionString*(): cstring {.importc: "jack_get_version_string".}
|
|
|
|
|
|
|
|
|
|
|
|
# --------------------------- Memory management ---------------------------
|
|
|
|
|
|
|
|
# void jack_free(void* ptr) ;
|
|
|
|
proc free*(`ptr`: pointer) {.importc: "jack_free".}
|
|
|
|
|
|
|
|
|
|
|
|
# -------------------------------- Clients --------------------------------
|
|
|
|
|
|
|
|
# jack_client_t * jack_client_open (char *client_name,
|
|
|
|
# jack_options_t options,
|
|
|
|
# jack_status_t *status, ...) ;
|
2023-05-22 05:13:31 +02:00
|
|
|
proc clientOpen*(clientName: cstring; options: cint; status: ptr cint): ClientP {.
|
2022-10-06 04:18:57 +02:00
|
|
|
varargs, importc: "jack_client_open".}
|
|
|
|
|
|
|
|
# DEPRECATED
|
2023-05-22 05:13:31 +02:00
|
|
|
# proc clientNew*(clientName: cstring): ClientP {.importc: "jack_client_new".}
|
2022-10-06 04:18:57 +02:00
|
|
|
|
|
|
|
# int jack_client_close (jack_client_t *client) ;
|
2023-05-22 05:13:31 +02:00
|
|
|
proc clientClose*(client: ClientP): cint {.importc: "jack_client_close"}
|
2022-10-06 04:18:57 +02:00
|
|
|
|
|
|
|
# int jack_client_name_size (void) ;
|
|
|
|
proc clientNameSize*(): cint {.importc: "jack_client_name_size"}
|
|
|
|
|
|
|
|
# char * jack_get_client_name (jack_client_t *client) ;
|
2023-05-22 05:13:31 +02:00
|
|
|
proc getClientName*(client: ClientP): cstring {.importc: "jack_get_client_name".}
|
2022-10-06 04:18:57 +02:00
|
|
|
|
|
|
|
# char *jack_get_uuid_for_client_name (jack_client_t *client,
|
|
|
|
# const char *client_name) ;
|
2023-05-22 05:13:31 +02:00
|
|
|
proc getUuidForClientName*(client: ClientP; clientName: cstring): cstring {.
|
2022-10-06 04:18:57 +02:00
|
|
|
importc: "jack_get_uuid_for_client_name".}
|
|
|
|
|
|
|
|
# char *jack_get_client_name_by_uuid (jack_client_t *client,
|
|
|
|
# const char *client_uuid ) ;
|
2023-05-22 05:13:31 +02:00
|
|
|
proc getClientNameByUuid*(client: ClientP; clientUuid: cstring): cstring {.
|
2022-10-06 04:18:57 +02:00
|
|
|
importc: "jack_get_client_name_by_uuid".}
|
|
|
|
|
|
|
|
#[ FIXME: not implemented yet
|
|
|
|
proc internalClientNew*(clientName: cstring; loadName: cstring; loadInit: cstring): cint {.
|
|
|
|
importc: "jack_internal_client_new".}
|
|
|
|
|
|
|
|
proc internalClientClose*(clientName: cstring) {.importc: "jack_internal_client_close".}
|
|
|
|
]#
|
|
|
|
|
|
|
|
# int jack_activate (jack_client_t *client) ;
|
2023-05-22 05:13:31 +02:00
|
|
|
proc activate*(client: ClientP): cint {.importc: "jack_activate".}
|
2022-10-06 04:18:57 +02:00
|
|
|
|
|
|
|
# int jack_deactivate (jack_client_t *client) ;
|
2023-05-22 05:13:31 +02:00
|
|
|
proc deactivate*(client: ClientP): cint {.importc: "jack_deactivate".}
|
2022-10-06 04:18:57 +02:00
|
|
|
|
|
|
|
# int jack_get_client_pid (const char *name) ;
|
|
|
|
proc getClientPid*(name: cstring): cint {.importc: "jack_get_client_pid".}
|
|
|
|
|
|
|
|
# FIXME: not implemented yet
|
|
|
|
# jack_native_thread_t jack_client_thread_id (jack_client_t *client) ;
|
2023-05-22 05:13:31 +02:00
|
|
|
# proc clientThreadId*(client: ClientP): NativeThread {.
|
2022-10-06 04:18:57 +02:00
|
|
|
# importc: "jack_client_thread_id".}
|
|
|
|
|
|
|
|
# int jack_is_realtime (jack_client_t *client) ;
|
2023-05-22 05:13:31 +02:00
|
|
|
proc isRealtime*(client: ClientP): cint {.importc: "jack_is_realtime".}
|
2022-10-06 04:18:57 +02:00
|
|
|
|
|
|
|
# DEPRECATED
|
2023-05-22 05:13:31 +02:00
|
|
|
# proc threadWait*(client: ClientP; status: cint): NFrames {.
|
2022-10-06 04:18:57 +02:00
|
|
|
# importc: "jack_thread_wait".}
|
|
|
|
|
|
|
|
# jack_nframes_t jack_cycle_wait (jack_client_t* client) ;
|
2023-05-22 05:13:31 +02:00
|
|
|
proc cycleWait*(client: ClientP): NFrames {.importc: "jack_cycle_wait".}
|
2022-10-06 04:18:57 +02:00
|
|
|
|
|
|
|
# void jack_cycle_signal (jack_client_t* client, int status) ;
|
2023-05-22 05:13:31 +02:00
|
|
|
proc cycleSignal*(client: ClientP; status: cint) {.importc: "jack_cycle_signal".}
|
2022-10-06 04:18:57 +02:00
|
|
|
|
|
|
|
|
|
|
|
# ------------------------------- Callbacks -------------------------------
|
|
|
|
|
2023-05-22 05:13:31 +02:00
|
|
|
proc setProcessThread*(client: ClientP; threadCallback: JackThreadCallback; arg: pointer): cint {.
|
2022-10-06 04:18:57 +02:00
|
|
|
importc: "jack_set_process_thread".}
|
|
|
|
|
2023-05-22 05:13:31 +02:00
|
|
|
proc setThreadInitCallback*(client: ClientP; threadInitCallback: JackThreadInitCallback; arg: pointer): cint {.
|
2022-10-06 04:18:57 +02:00
|
|
|
importc: "jack_set_thread_init_callback".}
|
|
|
|
|
2023-05-22 05:13:31 +02:00
|
|
|
proc onShutdown*(client: ClientP; shutdownCallback: JackShutdownCallback; arg: pointer) {.
|
2022-10-06 04:18:57 +02:00
|
|
|
importc: "jack_on_shutdown".}
|
|
|
|
|
2023-05-22 05:13:31 +02:00
|
|
|
proc onInfoShutdown*(client: ClientP; shutdownCallback: JackInfoShutdownCallback; arg: pointer) {.
|
2022-10-06 04:18:57 +02:00
|
|
|
importc: "jack_on_info_shutdown".}
|
|
|
|
|
2023-05-22 05:13:31 +02:00
|
|
|
proc setProcessCallback*(client: ClientP; processCallback: JackProcessCallback; arg: pointer): cint {.
|
2022-10-06 04:18:57 +02:00
|
|
|
importc: "jack_set_process_callback".}
|
|
|
|
|
2023-05-22 05:13:31 +02:00
|
|
|
proc setFreewheelCallback*(client: ClientP; freewheelCallback: JackFreewheelCallback; arg: pointer): cint {.
|
2022-10-06 04:18:57 +02:00
|
|
|
importc: "jack_set_freewheel_callback".}
|
|
|
|
|
2023-05-22 05:13:31 +02:00
|
|
|
proc setBufferSizeCallback*(client: ClientP; bufsizeCallback: JackBufferSizeCallback; arg: pointer): cint {.
|
2022-10-06 04:18:57 +02:00
|
|
|
importc: "jack_set_buffer_size_callback".}
|
|
|
|
|
2023-05-22 05:13:31 +02:00
|
|
|
proc setSampleRateCallback*(client: ClientP; srateCallback: JackSampleRateCallback; arg: pointer): cint {.
|
2022-10-06 04:18:57 +02:00
|
|
|
importc: "jack_set_sample_rate_callback".}
|
|
|
|
|
2023-05-22 05:13:31 +02:00
|
|
|
proc setClientRegistrationCallback*(client: ClientP; registrationCallback: JackClientRegistrationCallback;
|
2022-10-06 04:18:57 +02:00
|
|
|
arg: pointer): cint {.
|
|
|
|
importc: "jack_set_client_registration_callback".}
|
|
|
|
|
2023-05-22 05:13:31 +02:00
|
|
|
proc setPortRegistrationCallback*(client: ClientP; registrationCallback: JackPortRegistrationCallback;
|
2022-10-06 04:18:57 +02:00
|
|
|
arg: pointer): cint {.
|
|
|
|
importc: "jack_set_port_registration_callback".}
|
|
|
|
|
2023-05-22 05:13:31 +02:00
|
|
|
proc setPortConnectCallback*(client: ClientP; connectCallback: JackPortConnectCallback; arg: pointer): cint {.
|
2022-10-06 04:18:57 +02:00
|
|
|
importc: "jack_set_port_connect_callback".}
|
|
|
|
|
2023-05-22 05:13:31 +02:00
|
|
|
proc setPortRenameCallback*(client: ClientP; renameCallback: JackPortRenameCallback; arg: pointer): cint {.
|
2022-10-06 04:18:57 +02:00
|
|
|
importc: "jack_set_port_rename_callback".}
|
|
|
|
|
2023-05-22 05:13:31 +02:00
|
|
|
proc setGraphOrderCallback*(client: ClientP; graphCallback: JackGraphOrderCallback; a3: pointer): cint {.
|
2022-10-06 04:18:57 +02:00
|
|
|
importc: "jack_set_graph_order_callback".}
|
|
|
|
|
2023-05-22 05:13:31 +02:00
|
|
|
proc setXrunCallback*(client: ClientP; xrunCallback: JackXRunCallback; arg: pointer): cint {.
|
2022-10-06 04:18:57 +02:00
|
|
|
importc: "jack_set_xrun_callback".}
|
|
|
|
|
2023-05-22 05:13:31 +02:00
|
|
|
proc setLatencyCallback*(client: ClientP; latencyCallback: JackLatencyCallback; arg: pointer): cint {.
|
2022-10-06 04:18:57 +02:00
|
|
|
importc: "jack_set_latency_callback".}
|
|
|
|
|
|
|
|
|
|
|
|
# -------------------------- Server Client Control ------------------------
|
|
|
|
|
|
|
|
# int jack_set_freewheel(jack_client_t* client, int onoff) ;
|
2023-05-22 05:13:31 +02:00
|
|
|
proc setFreewheel*(client: ClientP; onoff: cint): cint {.importc: "jack_set_freewheel".}
|
2022-10-06 04:18:57 +02:00
|
|
|
|
|
|
|
# int jack_set_buffer_size (jack_client_t *client, jack_nframes_t nframes) ;
|
2023-05-22 05:13:31 +02:00
|
|
|
proc setBufferSize*(client: ClientP; nframes: NFrames): cint {.importc: "jack_set_buffer_size".}
|
2022-10-06 04:18:57 +02:00
|
|
|
|
|
|
|
#jack_nframes_t jack_get_sample_rate (jack_client_t *) ;
|
2023-05-22 05:13:31 +02:00
|
|
|
proc getSampleRate*(client: ClientP): NFrames {.importc: "jack_get_sample_rate".}
|
2022-10-06 04:18:57 +02:00
|
|
|
|
|
|
|
# jack_nframes_t jack_get_buffer_size (jack_client_t *) ;
|
2023-05-22 05:13:31 +02:00
|
|
|
proc getBufferSize*(client: ClientP): NFrames {.importc: "jack_get_buffer_size".}
|
2022-10-06 04:18:57 +02:00
|
|
|
|
|
|
|
# DEPRECATED
|
2023-05-22 05:13:31 +02:00
|
|
|
# proc engineTakeoverTimebase*(a1: ClientP): cint {.
|
2022-10-06 04:18:57 +02:00
|
|
|
# importc: "jack_engine_takeover_timebase".}
|
|
|
|
|
|
|
|
# float jack_cpu_load (jack_client_t *client) ;
|
2023-05-22 05:13:31 +02:00
|
|
|
proc cpuLoad*(client: ClientP): cfloat {.importc: "jack_cpu_load".}
|
2022-10-06 04:18:57 +02:00
|
|
|
|
|
|
|
|
|
|
|
# --------------------------------- Ports ---------------------------------
|
|
|
|
|
|
|
|
# jack_port_t * jack_port_register (jack_client_t *client,
|
|
|
|
# const char *port_name,
|
|
|
|
# const char *port_type,
|
|
|
|
# unsigned long flags,
|
|
|
|
# unsigned long buffer_size) ;
|
2023-05-22 05:13:31 +02:00
|
|
|
proc portRegister*(client: ClientP; portName: cstring; portType: cstring;
|
|
|
|
flags: culong; bufferSize: culong): PortP {.importc: "jack_port_register".}
|
2022-10-06 04:18:57 +02:00
|
|
|
|
|
|
|
# int jack_port_unregister (jack_client_t *client, jack_port_t *port) ;
|
2023-05-22 05:13:31 +02:00
|
|
|
proc portUnregister*(client: ClientP; port: PortP): cint {.importc: "jack_port_unregister".}
|
2022-10-06 04:18:57 +02:00
|
|
|
|
|
|
|
# void * jack_port_get_buffer (jack_port_t *port, jack_nframes_t) ;
|
2023-05-22 05:13:31 +02:00
|
|
|
proc portGetBuffer*(port: PortP; nframes: NFrames): pointer {.importc: "jack_port_get_buffer".}
|
2022-10-06 04:18:57 +02:00
|
|
|
|
|
|
|
# jack_uuid_t jack_port_uuid (const jack_port_t *port) ;
|
2023-05-22 05:13:31 +02:00
|
|
|
proc portUuid*(port: PortP): Uuid {.importc: "jack_port_uuid".}
|
2022-10-06 04:18:57 +02:00
|
|
|
|
|
|
|
# const char * jack_port_name (const jack_port_t *port) ;
|
2023-05-22 05:13:31 +02:00
|
|
|
proc portName*(port: PortP): cstring {.importc: "jack_port_name".}
|
2022-10-06 04:18:57 +02:00
|
|
|
|
|
|
|
# const char * jack_port_short_name (const jack_port_t *port) ;
|
2023-05-22 05:13:31 +02:00
|
|
|
proc portShortName*(port: PortP): cstring {.importc: "jack_port_short_name".}
|
2022-10-06 04:18:57 +02:00
|
|
|
|
|
|
|
# int jack_port_flags (const jack_port_t *port) ;
|
2023-05-22 05:13:31 +02:00
|
|
|
proc portFlags*(port: PortP): cint {.importc: "jack_port_flags".}
|
2022-10-06 04:18:57 +02:00
|
|
|
|
|
|
|
# const char * jack_port_type (const jack_port_t *port) ;
|
2023-05-22 05:13:31 +02:00
|
|
|
proc portType*(port: PortP): cstring {.importc: "jack_port_type".}
|
2022-10-06 04:18:57 +02:00
|
|
|
|
|
|
|
# jack_port_type_id_t jack_port_type_id (const jack_port_t *port) ;
|
2023-05-22 05:13:31 +02:00
|
|
|
proc portTypeId*(port: PortP): PortTypeId {.importc: "jack_port_type_id".}
|
2022-10-06 04:18:57 +02:00
|
|
|
|
|
|
|
# int jack_port_is_mine (const jack_client_t *client, const jack_port_t *port) ;
|
2023-05-22 05:13:31 +02:00
|
|
|
proc portIsMine*(client: ClientP; port: PortP): cint {.
|
2022-10-06 04:18:57 +02:00
|
|
|
importc: "jack_port_is_mine".}
|
|
|
|
|
|
|
|
# int jack_port_connected (const jack_port_t *port) ;
|
2023-05-22 05:13:31 +02:00
|
|
|
proc portConnected*(port: PortP): cint {.importc: "jack_port_connected".}
|
2022-10-06 04:18:57 +02:00
|
|
|
|
|
|
|
# int jack_port_connected_to (const jack_port_t *port,
|
|
|
|
# const char *port_name) ;
|
2023-05-22 05:13:31 +02:00
|
|
|
proc portConnectedTo*(port: PortP; portName: cstring): cint {.importc: "jack_port_connected_to".}
|
2022-10-06 04:18:57 +02:00
|
|
|
|
|
|
|
# const char ** jack_port_get_connections (const jack_port_t *port) ;
|
|
|
|
#
|
|
|
|
# CAVEAT: The caller is responsible for calling jack_free() on any non-NULL
|
|
|
|
# returned value.
|
2023-05-22 05:13:31 +02:00
|
|
|
proc portGetConnections*(port: PortP): cstringArray {.importc: "jack_port_get_connections".}
|
2022-10-06 04:18:57 +02:00
|
|
|
|
|
|
|
# const char ** jack_port_get_all_connections (const jack_client_t *client,
|
|
|
|
# const jack_port_t *port) ;
|
|
|
|
#
|
|
|
|
# CAVEAT: The caller is responsible for calling jack_free() on any non-NULL
|
|
|
|
# returned value.
|
2023-05-22 05:13:31 +02:00
|
|
|
proc portGetAllConnections*(client: ClientP; port: PortP): cstringArray {.
|
2022-10-06 04:18:57 +02:00
|
|
|
importc: "jack_port_get_all_connections".}
|
|
|
|
|
|
|
|
#[ DEPRECATED
|
2023-05-22 05:13:31 +02:00
|
|
|
proc portTie*(src: PortP; dst: PortP): cint {.importc: "jack_port_tie".}
|
2022-10-06 04:18:57 +02:00
|
|
|
|
2023-05-22 05:13:31 +02:00
|
|
|
proc portUntie*(port: PortP): cint {.importc: "jack_port_untie".}
|
2022-10-06 04:18:57 +02:00
|
|
|
|
2023-05-22 05:13:31 +02:00
|
|
|
proc portSetName*(port: PortP; portName: cstring): cint {.importc: "jack_port_set_name".}
|
2022-10-06 04:18:57 +02:00
|
|
|
]#
|
|
|
|
|
|
|
|
# int jack_port_rename (jack_client_t* client, jack_port_t *port, const char *port_name) ;
|
2023-05-22 05:13:31 +02:00
|
|
|
proc portRename*(client: ClientP; port: PortP; portName: cstring): cint {.importc: "jack_port_rename".}
|
2022-10-06 04:18:57 +02:00
|
|
|
|
|
|
|
# int jack_port_set_alias (jack_port_t *port, const char *alias) ;
|
2023-05-22 05:13:31 +02:00
|
|
|
proc portSetAlias*(port: PortP; alias: cstring): cint {.importc: "jack_port_set_alias".}
|
2022-10-06 04:18:57 +02:00
|
|
|
|
|
|
|
# int jack_port_unset_alias (jack_port_t *port, const char *alias) ;
|
2023-05-22 05:13:31 +02:00
|
|
|
proc portUnsetAlias*(port: PortP; alias: cstring): cint {.importc: "jack_port_unset_alias".}
|
2022-10-06 04:18:57 +02:00
|
|
|
|
|
|
|
# int jack_port_get_aliases (const jack_port_t *port, char* const aliases[2]) ;
|
2023-05-22 05:13:31 +02:00
|
|
|
proc portGetAliases*(port: PortP; aliases: array[2, cstring]): cint {.importc: "jack_port_get_aliases".}
|
2022-10-06 04:18:57 +02:00
|
|
|
|
|
|
|
#int jack_port_request_monitor (jack_port_t *port, int onoff) ;
|
2023-05-22 05:13:31 +02:00
|
|
|
proc portRequestMonitor*(port: PortP; onoff: cint): cint {.importc: "jack_port_request_monitor".}
|
2022-10-06 04:18:57 +02:00
|
|
|
|
|
|
|
# int jack_port_request_monitor_by_name (jack_client_t *client,
|
|
|
|
# const char *port_name, int onoff) ;
|
2023-05-22 05:13:31 +02:00
|
|
|
proc portRequestMonitorByName*(client: ClientP; portName: cstring; onoff: cint): cint {.
|
2022-10-06 04:18:57 +02:00
|
|
|
importc: "jack_port_request_monitor_by_name".}
|
|
|
|
|
|
|
|
# int jack_port_ensure_monitor (jack_port_t *port, int onoff) ;
|
2023-05-22 05:13:31 +02:00
|
|
|
proc portEnsureMonitor*(port: PortP; onoff: cint): cint {.
|
2022-10-06 04:18:57 +02:00
|
|
|
importc: "jack_port_ensure_monitor".}
|
|
|
|
|
|
|
|
# int jack_port_monitoring_input (jack_port_t *port) ;
|
2023-05-22 05:13:31 +02:00
|
|
|
proc portMonitoringInput*(port: PortP): cint {.importc: "jack_port_monitoring_input".}
|
2022-10-06 04:18:57 +02:00
|
|
|
|
|
|
|
# ------------------------------ Connections ------------------------------
|
|
|
|
|
|
|
|
# int jack_connect (jack_client_t *client,
|
|
|
|
# const char *source_port,
|
|
|
|
# const char *destination_port) ;
|
2023-05-22 05:13:31 +02:00
|
|
|
proc connect*(client: ClientP; srcPort: cstring; destPort: cstring): cint {.importc: "jack_connect".}
|
2022-10-06 04:18:57 +02:00
|
|
|
|
|
|
|
# int jack_disconnect (jack_client_t *client,
|
|
|
|
# const char *source_port,
|
|
|
|
# const char *destination_port) ;
|
2023-05-22 05:13:31 +02:00
|
|
|
proc disconnect*(client: ClientP; srcPort: cstring; destPort: cstring): cint {.importc: "jack_disconnect".}
|
2022-10-06 04:18:57 +02:00
|
|
|
|
|
|
|
# int jack_port_disconnect (jack_client_t *client, jack_port_t *port) ;
|
2023-05-22 05:13:31 +02:00
|
|
|
proc portDisconnect*(client: ClientP; port: PortP): cint {.importc: "jack_port_disconnect".}
|
2022-10-06 04:18:57 +02:00
|
|
|
|
|
|
|
# int jack_port_name_size(void) ;
|
|
|
|
proc portNameSize*(): cint {.importc: "jack_port_name_size".}
|
|
|
|
|
|
|
|
# int jack_port_type_size(void) ;
|
|
|
|
proc portTypeSize*(): cint {.importc: "jack_port_type_size".}
|
|
|
|
|
|
|
|
# size_t jack_port_type_get_buffer_size (jack_client_t *client, const char *port_type) ;
|
2023-05-22 05:13:31 +02:00
|
|
|
proc portTypeGetBufferSize*(client: ClientP; portType: cstring): csize_t {.
|
2022-10-06 04:18:57 +02:00
|
|
|
importc: "jack_port_type_get_buffer_size".}
|
|
|
|
|
2023-05-22 07:09:35 +02:00
|
|
|
# --------------------------------- MIDI ----------------------------------
|
|
|
|
|
|
|
|
# jack_nframes_t jack_midi_get_event_count (void *port_buffer)
|
|
|
|
proc midiGetEventCount*(portBuffer: pointer): NFrames {.importc: "jack_midi_get_event_count".}
|
|
|
|
|
|
|
|
# int jack_midi_event_get (jack_midi_event_t *event, void *port_buffer, uint32_t event_index)
|
|
|
|
proc midiEventGet*(event: MidiEventP, portBuffer: pointer, eventIndex: uint32): cint {.
|
|
|
|
importc: "jack_midi_event_get".}
|
|
|
|
|
|
|
|
# void jack_midi_clear_buffer (void *port_buffer)
|
|
|
|
proc midiClearBuffer*(portBuffer: pointer) {.importc: "jack_midi_clear_buffer".}
|
|
|
|
|
|
|
|
# size_t jack_midi_max_event_size (void *port_buffer)
|
|
|
|
proc midiMaxEventSize*(portBuffer: pointer): csize_t {.importc: "jack_midi_max_event_size".}
|
|
|
|
|
|
|
|
# jack_midi_data_t * jack_midi_event_reserve (void *port_buffer, jack_nframes_t time, size_t data_size)
|
|
|
|
proc midiEventReserve*(portBuffer: pointer, time: NFrames, dataSize: csize_t): ptr MidiData {.
|
|
|
|
importc: "jack_midi_event_reserve".}
|
|
|
|
|
|
|
|
# int jack_midi_event_write (void *port_buffer, jack_nframes_t time, const jack_midi_data_t *data, size_t data_size)
|
|
|
|
proc midiEventWrite*(portBuffer: pointer, time: NFrames, data: ptr MidiData, dataSize: csize_t): int {.
|
|
|
|
importc: "jack_midi_event_write".}
|
|
|
|
|
|
|
|
# uint32_t jack_midi_get_lost_event_count (void *port_buffer)
|
|
|
|
proc midiGetLostEventCount*(portBuffer: pointer): uint32 {.importc: "jack_midi_get_lost_event_count".}
|
|
|
|
|
2022-10-06 04:18:57 +02:00
|
|
|
# -------------------------------- Latency --------------------------------
|
|
|
|
|
|
|
|
#[ FIXME: not implemented yet
|
|
|
|
# void jack_port_set_latency (jack_port_t *port, jack_nframes_t) ;
|
2023-05-22 05:13:31 +02:00
|
|
|
proc portSetLatency*(port: PortP; a2: NFrames) {.importc: "jack_port_set_latency".}
|
2022-10-06 04:18:57 +02:00
|
|
|
|
|
|
|
#[ FIXME: not implemented yet
|
|
|
|
# void jack_port_get_latency_range (jack_port_t *port, jack_latency_callback_mode_t mode, jack_latency_range_t *range) ;
|
2023-05-22 05:13:31 +02:00
|
|
|
proc portGetLatencyRange*(port: PortP; mode: LatencyCallbackMode;
|
|
|
|
range: ptr LatencyRange) {.importc: "jack_port_get_latency_range".}
|
2022-10-06 04:18:57 +02:00
|
|
|
|
2023-05-22 05:13:31 +02:00
|
|
|
proc portSetLatencyRange*(port: PortP; mode: LatencyCallbackMode;
|
|
|
|
range: ptr LatencyRange) {.importc: "jack_port_set_latency_range".}
|
2022-10-06 04:18:57 +02:00
|
|
|
]#
|
|
|
|
|
2023-05-22 05:13:31 +02:00
|
|
|
proc recomputeTotalLatencies*(client: ClientP): cint {.importc: "jack_recompute_total_latencies".}
|
2022-10-06 04:18:57 +02:00
|
|
|
|
2023-05-22 05:13:31 +02:00
|
|
|
proc portGetLatency*(port: PortP): NFrames {.importc: "jack_port_get_latency".}
|
2022-10-06 04:18:57 +02:00
|
|
|
|
2023-05-22 05:13:31 +02:00
|
|
|
proc portGetTotalLatency*(client: ClientP; port: PortP): NFrames {.importc: "jack_port_get_total_latency".}
|
2022-10-06 04:18:57 +02:00
|
|
|
|
2023-05-22 05:13:31 +02:00
|
|
|
proc recomputeTotalLatency*(a1: ClientP; port: PortP): cint {.importc: "jack_recompute_total_latency".}
|
2022-10-06 04:18:57 +02:00
|
|
|
]#
|
|
|
|
|
|
|
|
# ------------------------------ Port Lookup ------------------------------
|
|
|
|
|
|
|
|
# const char ** jack_get_ports (jack_client_t *client,
|
|
|
|
# const char *port_name_pattern,
|
|
|
|
# const char *type_name_pattern,
|
|
|
|
# unsigned long flags) ;
|
|
|
|
#
|
|
|
|
# CAVEAT: The caller is responsible for calling jack_free() on any non-NULL
|
|
|
|
# returned value.
|
2023-05-22 05:13:31 +02:00
|
|
|
proc getPorts*(client: ClientP; portNamePattern: cstring;
|
2022-10-06 04:18:57 +02:00
|
|
|
typeNamePattern: cstring; flags: culong): cstringArray {.importc: "jack_get_ports".}
|
|
|
|
|
|
|
|
# jack_port_t * jack_port_by_name (jack_client_t *client, const char *port_name) ;
|
2023-05-22 05:13:31 +02:00
|
|
|
proc portByName*(client: ClientP; portName: cstring): PortP {.importc: "jack_port_by_name".}
|
2022-10-06 04:18:57 +02:00
|
|
|
|
|
|
|
# jack_port_t * jack_port_by_id (jack_client_t *client, jack_port_id_t port_id) ;
|
2023-05-22 05:13:31 +02:00
|
|
|
proc portById*(client: ClientP; portId: PortId): PortP {.importc: "jack_port_by_id".}
|
2022-10-06 04:18:57 +02:00
|
|
|
|
|
|
|
# ----------------------------- Time handling -----------------------------
|
|
|
|
|
|
|
|
# jack_nframes_t jack_frames_since_cycle_start (const jack_client_t *) ;
|
2023-05-22 05:13:31 +02:00
|
|
|
proc framesSinceCycleStart*(client: ClientP): NFrames {.importc: "jack_frames_since_cycle_start".}
|
2022-10-06 04:18:57 +02:00
|
|
|
|
|
|
|
# jack_nframes_t jack_frame_time (const jack_client_t *) ;
|
2023-05-22 05:13:31 +02:00
|
|
|
proc frameTime*(client: ClientP): NFrames {.importc: "jack_frame_time".}
|
2022-10-06 04:18:57 +02:00
|
|
|
|
|
|
|
# jack_nframes_t jack_last_frame_time (const jack_client_t *client) ;
|
2023-05-22 05:13:31 +02:00
|
|
|
proc lastFrameTime*(client: ClientP): NFrames {.importc: "jack_last_frame_time".}
|
2022-10-06 04:18:57 +02:00
|
|
|
|
|
|
|
# int jack_get_cycle_times(const jack_client_t *client,
|
|
|
|
# jack_nframes_t *current_frames,
|
|
|
|
# jack_time_t *current_usecs,
|
|
|
|
# jack_time_t *next_usecs,
|
|
|
|
# float *period_usecs) ;
|
2023-05-22 05:13:31 +02:00
|
|
|
proc getCycleTimes*(client: ClientP; currentFrames: ptr NFrames;
|
|
|
|
currentUsecs: ptr Time; nextUsecs: ptr Time;
|
2022-10-06 04:18:57 +02:00
|
|
|
periodUsecs: ptr cfloat): cint {.importc: "jack_get_cycle_times".}
|
|
|
|
|
|
|
|
# jack_time_t jack_frames_to_time(const jack_client_t *client, jack_nframes_t) ;
|
2023-05-22 05:13:31 +02:00
|
|
|
proc framesToTime*(client: ClientP; nframes: NFrames): Time {.importc: "jack_frames_to_time".}
|
2022-10-06 04:18:57 +02:00
|
|
|
|
|
|
|
# jack_nframes_t jack_time_to_frames(const jack_client_t *client, jack_time_t) ;
|
2023-05-22 05:13:31 +02:00
|
|
|
proc timeToFrames*(client: ClientP; time: Time): NFrames {.importc: "jack_time_to_frames".}
|
2022-10-06 04:18:57 +02:00
|
|
|
|
|
|
|
# jack_time_t jack_get_time(void) ;
|
2023-05-22 05:13:31 +02:00
|
|
|
proc getTime*(): Time {.importc: "jack_get_time".}
|
2022-10-06 04:18:57 +02:00
|
|
|
|
|
|
|
# ---------------------------- Error handling -----------------------------
|
|
|
|
|
|
|
|
proc setErrorFunction*(errorCallback: JackErrorCallback) {.importc: "jack_set_error_function".}
|
|
|
|
|
|
|
|
proc setInfoFunction*(infoCallback: JackInfoCallback) {.importc: "jack_set_info_function".}
|
|
|
|
|
|
|
|
{.pop.}
|
|
|
|
|
2022-10-09 09:13:05 +02:00
|
|
|
# --------------------------- Helper functions ----------------------------
|
|
|
|
|
2022-10-06 04:18:57 +02:00
|
|
|
proc getJackStatusErrorString*(status: cint): string =
|
|
|
|
# Get JACK error status as string.
|
2022-10-06 16:44:58 +02:00
|
|
|
if status == Success.ord:
|
2022-10-06 04:18:57 +02:00
|
|
|
return ""
|
|
|
|
|
2022-10-06 16:44:58 +02:00
|
|
|
if status == Failure.ord:
|
2022-10-06 04:18:57 +02:00
|
|
|
# Only include this generic message if no other error status is set
|
2022-10-06 16:44:58 +02:00
|
|
|
result = "Overall operation failed"
|
|
|
|
if (status and InvalidOption.ord) > 0:
|
|
|
|
result.add("\nThe operation contained an invalid and unsupported option")
|
|
|
|
if (status and NameNotUnique.ord) > 0:
|
|
|
|
result.add("\nThe desired client name was not unique")
|
|
|
|
if (status and ServerStarted.ord) > 0:
|
|
|
|
result.add("\nThe JACK server was started as a result of this operation")
|
|
|
|
if (status and ServerFailed.ord) > 0:
|
|
|
|
result.add("\nUnable to connect to the JACK server")
|
|
|
|
if (status and ServerError.ord) > 0:
|
|
|
|
result.add("\nCommunication error with the JACK server")
|
|
|
|
if (status and NoSuchClient.ord) > 0:
|
|
|
|
result.add("\nRequested client does not exist")
|
|
|
|
if (status and LoadFailure.ord) > 0:
|
|
|
|
result.add("\nUnable to load internal client")
|
|
|
|
if (status and InitFailure.ord) > 0:
|
|
|
|
result.add("\nUnable to initialize client")
|
|
|
|
if (status and ShmFailure.ord) > 0:
|
|
|
|
result.add("\nUnable to access shared memory")
|
|
|
|
if (status and VersionError.ord) > 0:
|
|
|
|
result.add("\nClient's protocol version does not match")
|
|
|
|
if (status and BackendError.ord) > 0:
|
|
|
|
result.add("\nBackend Error")
|
|
|
|
if (status and ClientZombie.ord) > 0:
|
|
|
|
result.add("\nClient is being shutdown against its will")
|