2 Copyright (C) 2001 Paul Davis
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU Lesser General Public License as published by
6 the Free Software Foundation; either version 2.1 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU Lesser General Public License for more details.
14 You should have received a copy of the GNU Lesser General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21 #ifndef __jack_port_h__
22 #define __jack_port_h__
25 #include <jack/types.h>
26 #include <jack/jslist.h>
29 #define JACK_PORT_NAME_SIZE 256
30 #define JACK_PORT_TYPE_SIZE 32
32 /* The relatively low value of this constant reflects the fact that
33 * JACK currently only knows about *2* port types. (May 2006)
35 * Further, the 4 covers:
36 * - a single non-negotiated audio format
37 * - music data (ie. MIDI)
41 * which is probably enough for more than just the foreseeable future.
43 #define JACK_MAX_PORT_TYPES 4
44 #define JACK_AUDIO_PORT_TYPE 0
45 #define JACK_MIDI_PORT_TYPE 1
47 /* these should probably go somewhere else, but not in <jack/types.h> */
48 #define JACK_CLIENT_NAME_SIZE 33
49 typedef uint32_t jack_client_id_t
;
51 /* JACK shared memory segments are limited to MAX_INT32, they can be
52 * shared between 32-bit and 64-bit clients.
54 #define JACK_SHM_MAX (MAX_INT32)
55 typedef int32_t jack_port_type_id_t
;
57 /* Port type structure.
59 * (1) One for each port type is part of the engine's jack_control_t
60 * shared memory structure.
62 * (2) One for each port type is appended to the engine's
63 * jack_client_connect_result_t response. The client reads them into
64 * its local memory, using them to attach the corresponding shared
67 typedef struct _jack_port_type_info
{
69 jack_port_type_id_t ptype_id
;
70 const char type_name
[JACK_PORT_TYPE_SIZE
];
72 /* If == 1, then a buffer to handle nframes worth of data has
73 * sizeof(jack_default_audio_sample_t) * nframes bytes.
75 * If > 1, the buffer allocated for input mixing will be
76 * this value times sizeof(jack_default_audio_sample_t)
77 * * nframes bytes in size. For non-audio data types,
78 * it may have a different value.
80 * If < 0, the value should be ignored, and buffer_size
83 int32_t buffer_scale_factor
;
85 /* ignored unless buffer_scale_factor is < 0. see above */
86 jack_shmsize_t buffer_size
;
88 jack_shm_registry_index_t shm_registry_index
;
90 jack_shmsize_t zero_buffer_offset
;
92 } jack_port_type_info_t
;
94 /* Allocated by the engine in shared memory. */
95 typedef struct _jack_port_shared
{
97 jack_port_type_id_t ptype_id
; /* index into port type array */
98 jack_shmsize_t offset
; /* buffer offset in shm segment */
99 jack_port_id_t id
; /* index into engine port array */
100 enum JackPortFlags flags
;
101 char name
[JACK_CLIENT_NAME_SIZE
+JACK_PORT_NAME_SIZE
];
102 jack_client_id_t client_id
; /* who owns me */
104 volatile jack_nframes_t latency
;
105 volatile jack_nframes_t total_latency
;
106 volatile uint8_t monitor_requests
;
108 char has_mixdown
; /* port has a mixdown function */
110 char unused
; /* legacy locked field */
112 } jack_port_shared_t
;
114 typedef struct _jack_port_functions
{
116 /* Function to initialize port buffer. Cannot be NULL.
117 * NOTE: This must take a buffer rather than jack_port_t as it is called
118 * in jack_engine_place_buffers() before any port creation.
119 * A better solution is to make jack_engine_place_buffers to be type-specific,
122 void (*buffer_init
)(void *buffer
, size_t size
);
124 /* Function to mixdown multiple inputs to a buffer. Can be NULL,
125 * indicating that multiple input connections are not legal for
128 void (*mixdown
)(jack_port_t
*, jack_nframes_t
);
130 } jack_port_functions_t
;
133 * Get port functions.
134 * @param ptid port type id.
136 * @return pointer to port type functions or NULL if port type is unknown.
138 /*const*/ jack_port_functions_t
*
139 jack_get_port_functions(jack_port_type_id_t ptid
);
142 /* Allocated by the client in local memory. */
144 void **client_segment_base
;
146 jack_port_type_info_t
*type_info
; /* shared memory type info */
147 struct _jack_port_shared
*shared
; /* corresponding shm struct */
148 struct _jack_port
*tied
; /* locally tied source port */
149 jack_port_functions_t fptr
;
150 pthread_mutex_t connection_lock
;
154 /* Inline would be cleaner, but it needs to be fast even in
155 * non-optimized code. jack_output_port_buffer() only handles output
156 * ports. jack_port_buffer() works for both input and output ports.
158 #define jack_port_buffer(p) \
159 ((void *) ((p)->mix_buffer? (p)->mix_buffer: \
160 *(p)->client_segment_base + (p)->shared->offset))
161 #define jack_output_port_buffer(p) \
162 ((void *) (*(p)->client_segment_base + (p)->shared->offset))
164 #endif /* __jack_port_h__ */