1 | /** |
2 | * \file include/seq.h |
3 | * \brief Application interface library for the ALSA driver |
4 | * \author Jaroslav Kysela <perex@perex.cz> |
5 | * \author Abramo Bagnara <abramo@alsa-project.org> |
6 | * \author Takashi Iwai <tiwai@suse.de> |
7 | * \date 1998-2001 |
8 | */ |
9 | /* |
10 | * Application interface library for the ALSA driver |
11 | * |
12 | * |
13 | * This library is free software; you can redistribute it and/or modify |
14 | * it under the terms of the GNU Lesser General Public License as |
15 | * published by the Free Software Foundation; either version 2.1 of |
16 | * the License, or (at your option) any later version. |
17 | * |
18 | * This program is distributed in the hope that it will be useful, |
19 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
20 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
21 | * GNU Lesser General Public License for more details. |
22 | * |
23 | * You should have received a copy of the GNU Lesser General Public |
24 | * License along with this library; if not, write to the Free Software |
25 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
26 | * |
27 | */ |
28 | |
29 | #ifndef __ALSA_SEQ_H |
30 | #define __ALSA_SEQ_H |
31 | |
32 | #ifdef __cplusplus |
33 | extern "C" { |
34 | #endif |
35 | |
36 | /** |
37 | * \defgroup Sequencer MIDI Sequencer |
38 | * MIDI Sequencer Interface. |
39 | * See \ref seq page for more details. |
40 | * \{ |
41 | */ |
42 | |
43 | /** dlsym version for interface entry callback */ |
44 | #define SND_SEQ_DLSYM_VERSION _dlsym_seq_001 |
45 | |
46 | /** Sequencer handle */ |
47 | typedef struct _snd_seq snd_seq_t; |
48 | |
49 | /** |
50 | * sequencer opening stream types |
51 | */ |
52 | #define SND_SEQ_OPEN_OUTPUT 1 /**< open for output (write) */ |
53 | #define SND_SEQ_OPEN_INPUT 2 /**< open for input (read) */ |
54 | #define SND_SEQ_OPEN_DUPLEX (SND_SEQ_OPEN_OUTPUT|SND_SEQ_OPEN_INPUT) /**< open for both input and output (read/write) */ |
55 | |
56 | /** |
57 | * sequencer opening mode |
58 | */ |
59 | #define SND_SEQ_NONBLOCK 0x0001 /**< non-blocking mode (flag to open mode) */ |
60 | |
61 | /** sequencer handle type */ |
62 | typedef enum _snd_seq_type { |
63 | SND_SEQ_TYPE_HW, /**< hardware */ |
64 | SND_SEQ_TYPE_SHM, /**< shared memory (NYI) */ |
65 | SND_SEQ_TYPE_INET /**< network (NYI) */ |
66 | } snd_seq_type_t; |
67 | |
68 | /** special client (port) ids */ |
69 | #define SND_SEQ_ADDRESS_UNKNOWN 253 /**< unknown source */ |
70 | #define SND_SEQ_ADDRESS_SUBSCRIBERS 254 /**< send event to all subscribed ports */ |
71 | #define SND_SEQ_ADDRESS_BROADCAST 255 /**< send event to all queues/clients/ports/channels */ |
72 | |
73 | /** known client numbers */ |
74 | #define SND_SEQ_CLIENT_SYSTEM 0 /**< system client */ |
75 | |
76 | /* |
77 | */ |
78 | int snd_seq_open(snd_seq_t **handle, const char *name, int streams, int mode); |
79 | int snd_seq_open_lconf(snd_seq_t **handle, const char *name, int streams, int mode, snd_config_t *lconf); |
80 | const char *snd_seq_name(snd_seq_t *seq); |
81 | snd_seq_type_t snd_seq_type(snd_seq_t *seq); |
82 | int snd_seq_close(snd_seq_t *handle); |
83 | int snd_seq_poll_descriptors_count(snd_seq_t *handle, short events); |
84 | int snd_seq_poll_descriptors(snd_seq_t *handle, struct pollfd *pfds, unsigned int space, short events); |
85 | int snd_seq_poll_descriptors_revents(snd_seq_t *seq, struct pollfd *pfds, unsigned int nfds, unsigned short *revents); |
86 | int snd_seq_nonblock(snd_seq_t *handle, int nonblock); |
87 | int snd_seq_client_id(snd_seq_t *handle); |
88 | |
89 | size_t snd_seq_get_output_buffer_size(snd_seq_t *handle); |
90 | size_t snd_seq_get_input_buffer_size(snd_seq_t *handle); |
91 | int snd_seq_set_output_buffer_size(snd_seq_t *handle, size_t size); |
92 | int snd_seq_set_input_buffer_size(snd_seq_t *handle, size_t size); |
93 | |
94 | /** system information container */ |
95 | typedef struct _snd_seq_system_info snd_seq_system_info_t; |
96 | |
97 | size_t snd_seq_system_info_sizeof(void); |
98 | /** allocate a #snd_seq_system_info_t container on stack */ |
99 | #define snd_seq_system_info_alloca(ptr) \ |
100 | __snd_alloca(ptr, snd_seq_system_info) |
101 | int snd_seq_system_info_malloc(snd_seq_system_info_t **ptr); |
102 | void snd_seq_system_info_free(snd_seq_system_info_t *ptr); |
103 | void snd_seq_system_info_copy(snd_seq_system_info_t *dst, const snd_seq_system_info_t *src); |
104 | |
105 | int snd_seq_system_info_get_queues(const snd_seq_system_info_t *info); |
106 | int snd_seq_system_info_get_clients(const snd_seq_system_info_t *info); |
107 | int snd_seq_system_info_get_ports(const snd_seq_system_info_t *info); |
108 | int snd_seq_system_info_get_channels(const snd_seq_system_info_t *info); |
109 | int snd_seq_system_info_get_cur_clients(const snd_seq_system_info_t *info); |
110 | int snd_seq_system_info_get_cur_queues(const snd_seq_system_info_t *info); |
111 | |
112 | int snd_seq_system_info(snd_seq_t *handle, snd_seq_system_info_t *info); |
113 | |
114 | /** \} */ |
115 | |
116 | |
117 | /** |
118 | * \defgroup SeqClient Sequencer Client Interface |
119 | * Sequencer Client Interface |
120 | * \ingroup Sequencer |
121 | * \{ |
122 | */ |
123 | |
124 | /** client information container */ |
125 | typedef struct _snd_seq_client_info snd_seq_client_info_t; |
126 | |
127 | /** client types */ |
128 | typedef enum snd_seq_client_type { |
129 | SND_SEQ_USER_CLIENT = 1, /**< user client */ |
130 | SND_SEQ_KERNEL_CLIENT = 2 /**< kernel client */ |
131 | } snd_seq_client_type_t; |
132 | |
133 | size_t snd_seq_client_info_sizeof(void); |
134 | /** allocate a #snd_seq_client_info_t container on stack */ |
135 | #define snd_seq_client_info_alloca(ptr) \ |
136 | __snd_alloca(ptr, snd_seq_client_info) |
137 | int snd_seq_client_info_malloc(snd_seq_client_info_t **ptr); |
138 | void snd_seq_client_info_free(snd_seq_client_info_t *ptr); |
139 | void snd_seq_client_info_copy(snd_seq_client_info_t *dst, const snd_seq_client_info_t *src); |
140 | |
141 | int snd_seq_client_info_get_client(const snd_seq_client_info_t *info); |
142 | snd_seq_client_type_t snd_seq_client_info_get_type(const snd_seq_client_info_t *info); |
143 | const char *snd_seq_client_info_get_name(snd_seq_client_info_t *info); |
144 | int snd_seq_client_info_get_broadcast_filter(const snd_seq_client_info_t *info); |
145 | int snd_seq_client_info_get_error_bounce(const snd_seq_client_info_t *info); |
146 | int snd_seq_client_info_get_card(const snd_seq_client_info_t *info); |
147 | int snd_seq_client_info_get_pid(const snd_seq_client_info_t *info); |
148 | const unsigned char *snd_seq_client_info_get_event_filter(const snd_seq_client_info_t *info); |
149 | int snd_seq_client_info_get_num_ports(const snd_seq_client_info_t *info); |
150 | int snd_seq_client_info_get_event_lost(const snd_seq_client_info_t *info); |
151 | |
152 | void snd_seq_client_info_set_client(snd_seq_client_info_t *info, int client); |
153 | void snd_seq_client_info_set_name(snd_seq_client_info_t *info, const char *name); |
154 | void snd_seq_client_info_set_broadcast_filter(snd_seq_client_info_t *info, int val); |
155 | void snd_seq_client_info_set_error_bounce(snd_seq_client_info_t *info, int val); |
156 | void snd_seq_client_info_set_event_filter(snd_seq_client_info_t *info, unsigned char *filter); |
157 | |
158 | void snd_seq_client_info_event_filter_clear(snd_seq_client_info_t *info); |
159 | void snd_seq_client_info_event_filter_add(snd_seq_client_info_t *info, int event_type); |
160 | void snd_seq_client_info_event_filter_del(snd_seq_client_info_t *info, int event_type); |
161 | int snd_seq_client_info_event_filter_check(snd_seq_client_info_t *info, int event_type); |
162 | |
163 | int snd_seq_get_client_info(snd_seq_t *handle, snd_seq_client_info_t *info); |
164 | int snd_seq_get_any_client_info(snd_seq_t *handle, int client, snd_seq_client_info_t *info); |
165 | int snd_seq_set_client_info(snd_seq_t *handle, snd_seq_client_info_t *info); |
166 | int snd_seq_query_next_client(snd_seq_t *handle, snd_seq_client_info_t *info); |
167 | |
168 | /* |
169 | */ |
170 | |
171 | /** client pool information container */ |
172 | typedef struct _snd_seq_client_pool snd_seq_client_pool_t; |
173 | |
174 | size_t snd_seq_client_pool_sizeof(void); |
175 | /** allocate a #snd_seq_client_pool_t container on stack */ |
176 | #define snd_seq_client_pool_alloca(ptr) \ |
177 | __snd_alloca(ptr, snd_seq_client_pool) |
178 | int snd_seq_client_pool_malloc(snd_seq_client_pool_t **ptr); |
179 | void snd_seq_client_pool_free(snd_seq_client_pool_t *ptr); |
180 | void snd_seq_client_pool_copy(snd_seq_client_pool_t *dst, const snd_seq_client_pool_t *src); |
181 | |
182 | int snd_seq_client_pool_get_client(const snd_seq_client_pool_t *info); |
183 | size_t snd_seq_client_pool_get_output_pool(const snd_seq_client_pool_t *info); |
184 | size_t snd_seq_client_pool_get_input_pool(const snd_seq_client_pool_t *info); |
185 | size_t snd_seq_client_pool_get_output_room(const snd_seq_client_pool_t *info); |
186 | size_t snd_seq_client_pool_get_output_free(const snd_seq_client_pool_t *info); |
187 | size_t snd_seq_client_pool_get_input_free(const snd_seq_client_pool_t *info); |
188 | void snd_seq_client_pool_set_output_pool(snd_seq_client_pool_t *info, size_t size); |
189 | void snd_seq_client_pool_set_input_pool(snd_seq_client_pool_t *info, size_t size); |
190 | void snd_seq_client_pool_set_output_room(snd_seq_client_pool_t *info, size_t size); |
191 | |
192 | int snd_seq_get_client_pool(snd_seq_t *handle, snd_seq_client_pool_t *info); |
193 | int snd_seq_set_client_pool(snd_seq_t *handle, snd_seq_client_pool_t *info); |
194 | |
195 | |
196 | /** \} */ |
197 | |
198 | |
199 | /** |
200 | * \defgroup SeqPort Sequencer Port Interface |
201 | * Sequencer Port Interface |
202 | * \ingroup Sequencer |
203 | * \{ |
204 | */ |
205 | |
206 | /** port information container */ |
207 | typedef struct _snd_seq_port_info snd_seq_port_info_t; |
208 | |
209 | /** known port numbers */ |
210 | #define SND_SEQ_PORT_SYSTEM_TIMER 0 /**< system timer port */ |
211 | #define SND_SEQ_PORT_SYSTEM_ANNOUNCE 1 /**< system announce port */ |
212 | |
213 | /** port capabilities (32 bits) */ |
214 | #define SND_SEQ_PORT_CAP_READ (1<<0) /**< readable from this port */ |
215 | #define SND_SEQ_PORT_CAP_WRITE (1<<1) /**< writable to this port */ |
216 | |
217 | #define SND_SEQ_PORT_CAP_SYNC_READ (1<<2) /**< allow read subscriptions */ |
218 | #define SND_SEQ_PORT_CAP_SYNC_WRITE (1<<3) /**< allow write subscriptions */ |
219 | |
220 | #define SND_SEQ_PORT_CAP_DUPLEX (1<<4) /**< allow read/write duplex */ |
221 | |
222 | #define SND_SEQ_PORT_CAP_SUBS_READ (1<<5) /**< allow read subscription */ |
223 | #define SND_SEQ_PORT_CAP_SUBS_WRITE (1<<6) /**< allow write subscription */ |
224 | #define SND_SEQ_PORT_CAP_NO_EXPORT (1<<7) /**< routing not allowed */ |
225 | |
226 | /* port type */ |
227 | /** Messages sent from/to this port have device-specific semantics. */ |
228 | #define SND_SEQ_PORT_TYPE_SPECIFIC (1<<0) |
229 | /** This port understands MIDI messages. */ |
230 | #define SND_SEQ_PORT_TYPE_MIDI_GENERIC (1<<1) |
231 | /** This port is compatible with the General MIDI specification. */ |
232 | #define SND_SEQ_PORT_TYPE_MIDI_GM (1<<2) |
233 | /** This port is compatible with the Roland GS standard. */ |
234 | #define SND_SEQ_PORT_TYPE_MIDI_GS (1<<3) |
235 | /** This port is compatible with the Yamaha XG specification. */ |
236 | #define SND_SEQ_PORT_TYPE_MIDI_XG (1<<4) |
237 | /** This port is compatible with the Roland MT-32. */ |
238 | #define SND_SEQ_PORT_TYPE_MIDI_MT32 (1<<5) |
239 | /** This port is compatible with the General MIDI 2 specification. */ |
240 | #define SND_SEQ_PORT_TYPE_MIDI_GM2 (1<<6) |
241 | /** This port understands SND_SEQ_EVENT_SAMPLE_xxx messages |
242 | (these are not MIDI messages). */ |
243 | #define SND_SEQ_PORT_TYPE_SYNTH (1<<10) |
244 | /** Instruments can be downloaded to this port |
245 | (with SND_SEQ_EVENT_INSTR_xxx messages sent directly). */ |
246 | #define SND_SEQ_PORT_TYPE_DIRECT_SAMPLE (1<<11) |
247 | /** Instruments can be downloaded to this port |
248 | (with SND_SEQ_EVENT_INSTR_xxx messages sent directly or through a queue). */ |
249 | #define SND_SEQ_PORT_TYPE_SAMPLE (1<<12) |
250 | /** This port is implemented in hardware. */ |
251 | #define SND_SEQ_PORT_TYPE_HARDWARE (1<<16) |
252 | /** This port is implemented in software. */ |
253 | #define SND_SEQ_PORT_TYPE_SOFTWARE (1<<17) |
254 | /** Messages sent to this port will generate sounds. */ |
255 | #define SND_SEQ_PORT_TYPE_SYNTHESIZER (1<<18) |
256 | /** This port may connect to other devices |
257 | (whose characteristics are not known). */ |
258 | #define SND_SEQ_PORT_TYPE_PORT (1<<19) |
259 | /** This port belongs to an application, such as a sequencer or editor. */ |
260 | #define SND_SEQ_PORT_TYPE_APPLICATION (1<<20) |
261 | |
262 | |
263 | size_t snd_seq_port_info_sizeof(void); |
264 | /** allocate a #snd_seq_port_info_t container on stack */ |
265 | #define snd_seq_port_info_alloca(ptr) \ |
266 | __snd_alloca(ptr, snd_seq_port_info) |
267 | int snd_seq_port_info_malloc(snd_seq_port_info_t **ptr); |
268 | void snd_seq_port_info_free(snd_seq_port_info_t *ptr); |
269 | void snd_seq_port_info_copy(snd_seq_port_info_t *dst, const snd_seq_port_info_t *src); |
270 | |
271 | int snd_seq_port_info_get_client(const snd_seq_port_info_t *info); |
272 | int snd_seq_port_info_get_port(const snd_seq_port_info_t *info); |
273 | const snd_seq_addr_t *snd_seq_port_info_get_addr(const snd_seq_port_info_t *info); |
274 | const char *snd_seq_port_info_get_name(const snd_seq_port_info_t *info); |
275 | unsigned int snd_seq_port_info_get_capability(const snd_seq_port_info_t *info); |
276 | unsigned int snd_seq_port_info_get_type(const snd_seq_port_info_t *info); |
277 | int snd_seq_port_info_get_midi_channels(const snd_seq_port_info_t *info); |
278 | int snd_seq_port_info_get_midi_voices(const snd_seq_port_info_t *info); |
279 | int snd_seq_port_info_get_synth_voices(const snd_seq_port_info_t *info); |
280 | int snd_seq_port_info_get_read_use(const snd_seq_port_info_t *info); |
281 | int snd_seq_port_info_get_write_use(const snd_seq_port_info_t *info); |
282 | int snd_seq_port_info_get_port_specified(const snd_seq_port_info_t *info); |
283 | int snd_seq_port_info_get_timestamping(const snd_seq_port_info_t *info); |
284 | int snd_seq_port_info_get_timestamp_real(const snd_seq_port_info_t *info); |
285 | int snd_seq_port_info_get_timestamp_queue(const snd_seq_port_info_t *info); |
286 | |
287 | void snd_seq_port_info_set_client(snd_seq_port_info_t *info, int client); |
288 | void snd_seq_port_info_set_port(snd_seq_port_info_t *info, int port); |
289 | void snd_seq_port_info_set_addr(snd_seq_port_info_t *info, const snd_seq_addr_t *addr); |
290 | void snd_seq_port_info_set_name(snd_seq_port_info_t *info, const char *name); |
291 | void snd_seq_port_info_set_capability(snd_seq_port_info_t *info, unsigned int capability); |
292 | void snd_seq_port_info_set_type(snd_seq_port_info_t *info, unsigned int type); |
293 | void snd_seq_port_info_set_midi_channels(snd_seq_port_info_t *info, int channels); |
294 | void snd_seq_port_info_set_midi_voices(snd_seq_port_info_t *info, int voices); |
295 | void snd_seq_port_info_set_synth_voices(snd_seq_port_info_t *info, int voices); |
296 | void snd_seq_port_info_set_port_specified(snd_seq_port_info_t *info, int val); |
297 | void snd_seq_port_info_set_timestamping(snd_seq_port_info_t *info, int enable); |
298 | void snd_seq_port_info_set_timestamp_real(snd_seq_port_info_t *info, int realtime); |
299 | void snd_seq_port_info_set_timestamp_queue(snd_seq_port_info_t *info, int queue); |
300 | |
301 | int snd_seq_create_port(snd_seq_t *handle, snd_seq_port_info_t *info); |
302 | int snd_seq_delete_port(snd_seq_t *handle, int port); |
303 | int snd_seq_get_port_info(snd_seq_t *handle, int port, snd_seq_port_info_t *info); |
304 | int snd_seq_get_any_port_info(snd_seq_t *handle, int client, int port, snd_seq_port_info_t *info); |
305 | int snd_seq_set_port_info(snd_seq_t *handle, int port, snd_seq_port_info_t *info); |
306 | int snd_seq_query_next_port(snd_seq_t *handle, snd_seq_port_info_t *info); |
307 | |
308 | /** \} */ |
309 | |
310 | |
311 | /** |
312 | * \defgroup SeqSubscribe Sequencer Port Subscription |
313 | * Sequencer Port Subscription |
314 | * \ingroup Sequencer |
315 | * \{ |
316 | */ |
317 | |
318 | /** port subscription container */ |
319 | typedef struct _snd_seq_port_subscribe snd_seq_port_subscribe_t; |
320 | |
321 | size_t snd_seq_port_subscribe_sizeof(void); |
322 | /** allocate a #snd_seq_port_subscribe_t container on stack */ |
323 | #define snd_seq_port_subscribe_alloca(ptr) \ |
324 | __snd_alloca(ptr, snd_seq_port_subscribe) |
325 | int snd_seq_port_subscribe_malloc(snd_seq_port_subscribe_t **ptr); |
326 | void snd_seq_port_subscribe_free(snd_seq_port_subscribe_t *ptr); |
327 | void snd_seq_port_subscribe_copy(snd_seq_port_subscribe_t *dst, const snd_seq_port_subscribe_t *src); |
328 | |
329 | const snd_seq_addr_t *snd_seq_port_subscribe_get_sender(const snd_seq_port_subscribe_t *info); |
330 | const snd_seq_addr_t *snd_seq_port_subscribe_get_dest(const snd_seq_port_subscribe_t *info); |
331 | int snd_seq_port_subscribe_get_queue(const snd_seq_port_subscribe_t *info); |
332 | int snd_seq_port_subscribe_get_exclusive(const snd_seq_port_subscribe_t *info); |
333 | int snd_seq_port_subscribe_get_time_update(const snd_seq_port_subscribe_t *info); |
334 | int snd_seq_port_subscribe_get_time_real(const snd_seq_port_subscribe_t *info); |
335 | |
336 | void snd_seq_port_subscribe_set_sender(snd_seq_port_subscribe_t *info, const snd_seq_addr_t *addr); |
337 | void snd_seq_port_subscribe_set_dest(snd_seq_port_subscribe_t *info, const snd_seq_addr_t *addr); |
338 | void snd_seq_port_subscribe_set_queue(snd_seq_port_subscribe_t *info, int q); |
339 | void snd_seq_port_subscribe_set_exclusive(snd_seq_port_subscribe_t *info, int val); |
340 | void snd_seq_port_subscribe_set_time_update(snd_seq_port_subscribe_t *info, int val); |
341 | void snd_seq_port_subscribe_set_time_real(snd_seq_port_subscribe_t *info, int val); |
342 | |
343 | int snd_seq_get_port_subscription(snd_seq_t *handle, snd_seq_port_subscribe_t *sub); |
344 | int snd_seq_subscribe_port(snd_seq_t *handle, snd_seq_port_subscribe_t *sub); |
345 | int snd_seq_unsubscribe_port(snd_seq_t *handle, snd_seq_port_subscribe_t *sub); |
346 | |
347 | /* |
348 | */ |
349 | |
350 | /** subscription query container */ |
351 | typedef struct _snd_seq_query_subscribe snd_seq_query_subscribe_t; |
352 | |
353 | /** type of query subscription */ |
354 | typedef enum { |
355 | SND_SEQ_QUERY_SUBS_READ, /**< query read subscriptions */ |
356 | SND_SEQ_QUERY_SUBS_WRITE /**< query write subscriptions */ |
357 | } snd_seq_query_subs_type_t; |
358 | |
359 | size_t snd_seq_query_subscribe_sizeof(void); |
360 | /** allocate a #snd_seq_query_subscribe_t container on stack */ |
361 | #define snd_seq_query_subscribe_alloca(ptr) \ |
362 | __snd_alloca(ptr, snd_seq_query_subscribe) |
363 | int snd_seq_query_subscribe_malloc(snd_seq_query_subscribe_t **ptr); |
364 | void snd_seq_query_subscribe_free(snd_seq_query_subscribe_t *ptr); |
365 | void snd_seq_query_subscribe_copy(snd_seq_query_subscribe_t *dst, const snd_seq_query_subscribe_t *src); |
366 | |
367 | int snd_seq_query_subscribe_get_client(const snd_seq_query_subscribe_t *info); |
368 | int snd_seq_query_subscribe_get_port(const snd_seq_query_subscribe_t *info); |
369 | const snd_seq_addr_t *snd_seq_query_subscribe_get_root(const snd_seq_query_subscribe_t *info); |
370 | snd_seq_query_subs_type_t snd_seq_query_subscribe_get_type(const snd_seq_query_subscribe_t *info); |
371 | int snd_seq_query_subscribe_get_index(const snd_seq_query_subscribe_t *info); |
372 | int snd_seq_query_subscribe_get_num_subs(const snd_seq_query_subscribe_t *info); |
373 | const snd_seq_addr_t *snd_seq_query_subscribe_get_addr(const snd_seq_query_subscribe_t *info); |
374 | int snd_seq_query_subscribe_get_queue(const snd_seq_query_subscribe_t *info); |
375 | int snd_seq_query_subscribe_get_exclusive(const snd_seq_query_subscribe_t *info); |
376 | int snd_seq_query_subscribe_get_time_update(const snd_seq_query_subscribe_t *info); |
377 | int snd_seq_query_subscribe_get_time_real(const snd_seq_query_subscribe_t *info); |
378 | |
379 | void snd_seq_query_subscribe_set_client(snd_seq_query_subscribe_t *info, int client); |
380 | void snd_seq_query_subscribe_set_port(snd_seq_query_subscribe_t *info, int port); |
381 | void snd_seq_query_subscribe_set_root(snd_seq_query_subscribe_t *info, const snd_seq_addr_t *addr); |
382 | void snd_seq_query_subscribe_set_type(snd_seq_query_subscribe_t *info, snd_seq_query_subs_type_t type); |
383 | void snd_seq_query_subscribe_set_index(snd_seq_query_subscribe_t *info, int _index); |
384 | |
385 | int snd_seq_query_port_subscribers(snd_seq_t *seq, snd_seq_query_subscribe_t * subs); |
386 | |
387 | /** \} */ |
388 | |
389 | |
390 | /** |
391 | * \defgroup SeqQueue Sequencer Queue Interface |
392 | * Sequencer Queue Interface |
393 | * \ingroup Sequencer |
394 | * \{ |
395 | */ |
396 | |
397 | /** queue information container */ |
398 | typedef struct _snd_seq_queue_info snd_seq_queue_info_t; |
399 | /** queue status container */ |
400 | typedef struct _snd_seq_queue_status snd_seq_queue_status_t; |
401 | /** queue tempo container */ |
402 | typedef struct _snd_seq_queue_tempo snd_seq_queue_tempo_t; |
403 | /** queue timer information container */ |
404 | typedef struct _snd_seq_queue_timer snd_seq_queue_timer_t; |
405 | |
406 | /** special queue ids */ |
407 | #define SND_SEQ_QUEUE_DIRECT 253 /**< direct dispatch */ |
408 | |
409 | size_t snd_seq_queue_info_sizeof(void); |
410 | /** allocate a #snd_seq_queue_info_t container on stack */ |
411 | #define snd_seq_queue_info_alloca(ptr) \ |
412 | __snd_alloca(ptr, snd_seq_queue_info) |
413 | int snd_seq_queue_info_malloc(snd_seq_queue_info_t **ptr); |
414 | void snd_seq_queue_info_free(snd_seq_queue_info_t *ptr); |
415 | void snd_seq_queue_info_copy(snd_seq_queue_info_t *dst, const snd_seq_queue_info_t *src); |
416 | |
417 | int snd_seq_queue_info_get_queue(const snd_seq_queue_info_t *info); |
418 | const char *snd_seq_queue_info_get_name(const snd_seq_queue_info_t *info); |
419 | int snd_seq_queue_info_get_owner(const snd_seq_queue_info_t *info); |
420 | int snd_seq_queue_info_get_locked(const snd_seq_queue_info_t *info); |
421 | unsigned int snd_seq_queue_info_get_flags(const snd_seq_queue_info_t *info); |
422 | |
423 | void snd_seq_queue_info_set_name(snd_seq_queue_info_t *info, const char *name); |
424 | void snd_seq_queue_info_set_owner(snd_seq_queue_info_t *info, int owner); |
425 | void snd_seq_queue_info_set_locked(snd_seq_queue_info_t *info, int locked); |
426 | void snd_seq_queue_info_set_flags(snd_seq_queue_info_t *info, unsigned int flags); |
427 | |
428 | int snd_seq_create_queue(snd_seq_t *seq, snd_seq_queue_info_t *info); |
429 | int snd_seq_alloc_named_queue(snd_seq_t *seq, const char *name); |
430 | int snd_seq_alloc_queue(snd_seq_t *handle); |
431 | int snd_seq_free_queue(snd_seq_t *handle, int q); |
432 | int snd_seq_get_queue_info(snd_seq_t *seq, int q, snd_seq_queue_info_t *info); |
433 | int snd_seq_set_queue_info(snd_seq_t *seq, int q, snd_seq_queue_info_t *info); |
434 | int snd_seq_query_named_queue(snd_seq_t *seq, const char *name); |
435 | |
436 | int snd_seq_get_queue_usage(snd_seq_t *handle, int q); |
437 | int snd_seq_set_queue_usage(snd_seq_t *handle, int q, int used); |
438 | |
439 | /* |
440 | */ |
441 | size_t snd_seq_queue_status_sizeof(void); |
442 | /** allocate a #snd_seq_queue_status_t container on stack */ |
443 | #define snd_seq_queue_status_alloca(ptr) \ |
444 | __snd_alloca(ptr, snd_seq_queue_status) |
445 | int snd_seq_queue_status_malloc(snd_seq_queue_status_t **ptr); |
446 | void snd_seq_queue_status_free(snd_seq_queue_status_t *ptr); |
447 | void snd_seq_queue_status_copy(snd_seq_queue_status_t *dst, const snd_seq_queue_status_t *src); |
448 | |
449 | int snd_seq_queue_status_get_queue(const snd_seq_queue_status_t *info); |
450 | int snd_seq_queue_status_get_events(const snd_seq_queue_status_t *info); |
451 | snd_seq_tick_time_t snd_seq_queue_status_get_tick_time(const snd_seq_queue_status_t *info); |
452 | const snd_seq_real_time_t *snd_seq_queue_status_get_real_time(const snd_seq_queue_status_t *info); |
453 | unsigned int snd_seq_queue_status_get_status(const snd_seq_queue_status_t *info); |
454 | |
455 | int snd_seq_get_queue_status(snd_seq_t *handle, int q, snd_seq_queue_status_t *status); |
456 | |
457 | /* |
458 | */ |
459 | size_t snd_seq_queue_tempo_sizeof(void); |
460 | /** allocate a #snd_seq_queue_tempo_t container on stack */ |
461 | #define snd_seq_queue_tempo_alloca(ptr) \ |
462 | __snd_alloca(ptr, snd_seq_queue_tempo) |
463 | int snd_seq_queue_tempo_malloc(snd_seq_queue_tempo_t **ptr); |
464 | void snd_seq_queue_tempo_free(snd_seq_queue_tempo_t *ptr); |
465 | void snd_seq_queue_tempo_copy(snd_seq_queue_tempo_t *dst, const snd_seq_queue_tempo_t *src); |
466 | |
467 | int snd_seq_queue_tempo_get_queue(const snd_seq_queue_tempo_t *info); |
468 | unsigned int snd_seq_queue_tempo_get_tempo(const snd_seq_queue_tempo_t *info); |
469 | int snd_seq_queue_tempo_get_ppq(const snd_seq_queue_tempo_t *info); |
470 | unsigned int snd_seq_queue_tempo_get_skew(const snd_seq_queue_tempo_t *info); |
471 | unsigned int snd_seq_queue_tempo_get_skew_base(const snd_seq_queue_tempo_t *info); |
472 | void snd_seq_queue_tempo_set_tempo(snd_seq_queue_tempo_t *info, unsigned int tempo); |
473 | void snd_seq_queue_tempo_set_ppq(snd_seq_queue_tempo_t *info, int ppq); |
474 | void snd_seq_queue_tempo_set_skew(snd_seq_queue_tempo_t *info, unsigned int skew); |
475 | void snd_seq_queue_tempo_set_skew_base(snd_seq_queue_tempo_t *info, unsigned int base); |
476 | |
477 | int snd_seq_get_queue_tempo(snd_seq_t *handle, int q, snd_seq_queue_tempo_t *tempo); |
478 | int snd_seq_set_queue_tempo(snd_seq_t *handle, int q, snd_seq_queue_tempo_t *tempo); |
479 | |
480 | /* |
481 | */ |
482 | |
483 | /** sequencer timer sources */ |
484 | typedef enum { |
485 | SND_SEQ_TIMER_ALSA = 0, /* ALSA timer */ |
486 | SND_SEQ_TIMER_MIDI_CLOCK = 1, /* Midi Clock (CLOCK event) */ |
487 | SND_SEQ_TIMER_MIDI_TICK = 2 /* Midi Timer Tick (TICK event */ |
488 | } snd_seq_queue_timer_type_t; |
489 | |
490 | size_t snd_seq_queue_timer_sizeof(void); |
491 | /** allocate a #snd_seq_queue_timer_t container on stack */ |
492 | #define snd_seq_queue_timer_alloca(ptr) \ |
493 | __snd_alloca(ptr, snd_seq_queue_timer) |
494 | int snd_seq_queue_timer_malloc(snd_seq_queue_timer_t **ptr); |
495 | void snd_seq_queue_timer_free(snd_seq_queue_timer_t *ptr); |
496 | void snd_seq_queue_timer_copy(snd_seq_queue_timer_t *dst, const snd_seq_queue_timer_t *src); |
497 | |
498 | int snd_seq_queue_timer_get_queue(const snd_seq_queue_timer_t *info); |
499 | snd_seq_queue_timer_type_t snd_seq_queue_timer_get_type(const snd_seq_queue_timer_t *info); |
500 | const snd_timer_id_t *snd_seq_queue_timer_get_id(const snd_seq_queue_timer_t *info); |
501 | unsigned int snd_seq_queue_timer_get_resolution(const snd_seq_queue_timer_t *info); |
502 | |
503 | void snd_seq_queue_timer_set_type(snd_seq_queue_timer_t *info, snd_seq_queue_timer_type_t type); |
504 | void snd_seq_queue_timer_set_id(snd_seq_queue_timer_t *info, const snd_timer_id_t *id); |
505 | void snd_seq_queue_timer_set_resolution(snd_seq_queue_timer_t *info, unsigned int resolution); |
506 | |
507 | int snd_seq_get_queue_timer(snd_seq_t *handle, int q, snd_seq_queue_timer_t *timer); |
508 | int snd_seq_set_queue_timer(snd_seq_t *handle, int q, snd_seq_queue_timer_t *timer); |
509 | |
510 | /** \} */ |
511 | |
512 | /** |
513 | * \defgroup SeqEvent Sequencer Event API |
514 | * Sequencer Event API |
515 | * \ingroup Sequencer |
516 | * \{ |
517 | */ |
518 | |
519 | int snd_seq_free_event(snd_seq_event_t *ev); |
520 | ssize_t snd_seq_event_length(snd_seq_event_t *ev); |
521 | int snd_seq_event_output(snd_seq_t *handle, snd_seq_event_t *ev); |
522 | int snd_seq_event_output_buffer(snd_seq_t *handle, snd_seq_event_t *ev); |
523 | int snd_seq_event_output_direct(snd_seq_t *handle, snd_seq_event_t *ev); |
524 | int snd_seq_event_input(snd_seq_t *handle, snd_seq_event_t **ev); |
525 | int snd_seq_event_input_pending(snd_seq_t *seq, int fetch_sequencer); |
526 | int snd_seq_drain_output(snd_seq_t *handle); |
527 | int snd_seq_event_output_pending(snd_seq_t *seq); |
528 | int snd_seq_extract_output(snd_seq_t *handle, snd_seq_event_t **ev); |
529 | int snd_seq_drop_output(snd_seq_t *handle); |
530 | int snd_seq_drop_output_buffer(snd_seq_t *handle); |
531 | int snd_seq_drop_input(snd_seq_t *handle); |
532 | int snd_seq_drop_input_buffer(snd_seq_t *handle); |
533 | |
534 | /** event removal conditionals */ |
535 | typedef struct _snd_seq_remove_events snd_seq_remove_events_t; |
536 | |
537 | /** Remove conditional flags */ |
538 | #define SND_SEQ_REMOVE_INPUT (1<<0) /**< Flush input queues */ |
539 | #define SND_SEQ_REMOVE_OUTPUT (1<<1) /**< Flush output queues */ |
540 | #define SND_SEQ_REMOVE_DEST (1<<2) /**< Restrict by destination q:client:port */ |
541 | #define SND_SEQ_REMOVE_DEST_CHANNEL (1<<3) /**< Restrict by channel */ |
542 | #define SND_SEQ_REMOVE_TIME_BEFORE (1<<4) /**< Restrict to before time */ |
543 | #define SND_SEQ_REMOVE_TIME_AFTER (1<<5) /**< Restrict to time or after */ |
544 | #define SND_SEQ_REMOVE_TIME_TICK (1<<6) /**< Time is in ticks */ |
545 | #define SND_SEQ_REMOVE_EVENT_TYPE (1<<7) /**< Restrict to event type */ |
546 | #define SND_SEQ_REMOVE_IGNORE_OFF (1<<8) /**< Do not flush off events */ |
547 | #define SND_SEQ_REMOVE_TAG_MATCH (1<<9) /**< Restrict to events with given tag */ |
548 | |
549 | size_t snd_seq_remove_events_sizeof(void); |
550 | /** allocate a #snd_seq_remove_events_t container on stack */ |
551 | #define snd_seq_remove_events_alloca(ptr) \ |
552 | __snd_alloca(ptr, snd_seq_remove_events) |
553 | int snd_seq_remove_events_malloc(snd_seq_remove_events_t **ptr); |
554 | void snd_seq_remove_events_free(snd_seq_remove_events_t *ptr); |
555 | void snd_seq_remove_events_copy(snd_seq_remove_events_t *dst, const snd_seq_remove_events_t *src); |
556 | |
557 | unsigned int snd_seq_remove_events_get_condition(const snd_seq_remove_events_t *info); |
558 | int snd_seq_remove_events_get_queue(const snd_seq_remove_events_t *info); |
559 | const snd_seq_timestamp_t *snd_seq_remove_events_get_time(const snd_seq_remove_events_t *info); |
560 | const snd_seq_addr_t *snd_seq_remove_events_get_dest(const snd_seq_remove_events_t *info); |
561 | int snd_seq_remove_events_get_channel(const snd_seq_remove_events_t *info); |
562 | int snd_seq_remove_events_get_event_type(const snd_seq_remove_events_t *info); |
563 | int snd_seq_remove_events_get_tag(const snd_seq_remove_events_t *info); |
564 | |
565 | void snd_seq_remove_events_set_condition(snd_seq_remove_events_t *info, unsigned int flags); |
566 | void snd_seq_remove_events_set_queue(snd_seq_remove_events_t *info, int queue); |
567 | void snd_seq_remove_events_set_time(snd_seq_remove_events_t *info, const snd_seq_timestamp_t *time); |
568 | void snd_seq_remove_events_set_dest(snd_seq_remove_events_t *info, const snd_seq_addr_t *addr); |
569 | void snd_seq_remove_events_set_channel(snd_seq_remove_events_t *info, int channel); |
570 | void snd_seq_remove_events_set_event_type(snd_seq_remove_events_t *info, int type); |
571 | void snd_seq_remove_events_set_tag(snd_seq_remove_events_t *info, int tag); |
572 | |
573 | int snd_seq_remove_events(snd_seq_t *handle, snd_seq_remove_events_t *info); |
574 | |
575 | /** \} */ |
576 | |
577 | /** |
578 | * \defgroup SeqMisc Sequencer Miscellaneous |
579 | * Sequencer Miscellaneous |
580 | * \ingroup Sequencer |
581 | * \{ |
582 | */ |
583 | |
584 | void snd_seq_set_bit(int nr, void *array); |
585 | void snd_seq_unset_bit(int nr, void *array); |
586 | int snd_seq_change_bit(int nr, void *array); |
587 | int snd_seq_get_bit(int nr, void *array); |
588 | |
589 | /** \} */ |
590 | |
591 | |
592 | /** |
593 | * \defgroup SeqEvType Sequencer Event Type Checks |
594 | * Sequencer Event Type Checks |
595 | * \ingroup Sequencer |
596 | * \{ |
597 | */ |
598 | |
599 | /* event type macros */ |
600 | enum { |
601 | SND_SEQ_EVFLG_RESULT, |
602 | SND_SEQ_EVFLG_NOTE, |
603 | SND_SEQ_EVFLG_CONTROL, |
604 | SND_SEQ_EVFLG_QUEUE, |
605 | SND_SEQ_EVFLG_SYSTEM, |
606 | SND_SEQ_EVFLG_MESSAGE, |
607 | SND_SEQ_EVFLG_CONNECTION, |
608 | SND_SEQ_EVFLG_SAMPLE, |
609 | SND_SEQ_EVFLG_USERS, |
610 | SND_SEQ_EVFLG_INSTR, |
611 | SND_SEQ_EVFLG_QUOTE, |
612 | SND_SEQ_EVFLG_NONE, |
613 | SND_SEQ_EVFLG_RAW, |
614 | SND_SEQ_EVFLG_FIXED, |
615 | SND_SEQ_EVFLG_VARIABLE, |
616 | SND_SEQ_EVFLG_VARUSR |
617 | }; |
618 | |
619 | enum { |
620 | SND_SEQ_EVFLG_NOTE_ONEARG, |
621 | SND_SEQ_EVFLG_NOTE_TWOARG |
622 | }; |
623 | |
624 | enum { |
625 | SND_SEQ_EVFLG_QUEUE_NOARG, |
626 | SND_SEQ_EVFLG_QUEUE_TICK, |
627 | SND_SEQ_EVFLG_QUEUE_TIME, |
628 | SND_SEQ_EVFLG_QUEUE_VALUE |
629 | }; |
630 | |
631 | /** |
632 | * Exported event type table |
633 | * |
634 | * This table is referred by snd_seq_ev_is_xxx. |
635 | */ |
636 | extern const unsigned int snd_seq_event_types[]; |
637 | |
638 | #define _SND_SEQ_TYPE(x) (1<<(x)) /**< master type - 24bit */ |
639 | #define _SND_SEQ_TYPE_OPT(x) ((x)<<24) /**< optional type - 8bit */ |
640 | |
641 | /** check the event type */ |
642 | #define snd_seq_type_check(ev,x) (snd_seq_event_types[(ev)->type] & _SND_SEQ_TYPE(x)) |
643 | |
644 | /** event type check: result events */ |
645 | #define snd_seq_ev_is_result_type(ev) \ |
646 | snd_seq_type_check(ev, SND_SEQ_EVFLG_RESULT) |
647 | /** event type check: note events */ |
648 | #define snd_seq_ev_is_note_type(ev) \ |
649 | snd_seq_type_check(ev, SND_SEQ_EVFLG_NOTE) |
650 | /** event type check: control events */ |
651 | #define snd_seq_ev_is_control_type(ev) \ |
652 | snd_seq_type_check(ev, SND_SEQ_EVFLG_CONTROL) |
653 | /** event type check: channel specific events */ |
654 | #define snd_seq_ev_is_channel_type(ev) \ |
655 | (snd_seq_event_types[(ev)->type] & (_SND_SEQ_TYPE(SND_SEQ_EVFLG_NOTE) | _SND_SEQ_TYPE(SND_SEQ_EVFLG_CONTROL))) |
656 | |
657 | /** event type check: queue control events */ |
658 | #define snd_seq_ev_is_queue_type(ev) \ |
659 | snd_seq_type_check(ev, SND_SEQ_EVFLG_QUEUE) |
660 | /** event type check: system status messages */ |
661 | #define snd_seq_ev_is_message_type(ev) \ |
662 | snd_seq_type_check(ev, SND_SEQ_EVFLG_MESSAGE) |
663 | /** event type check: system status messages */ |
664 | #define snd_seq_ev_is_subscribe_type(ev) \ |
665 | snd_seq_type_check(ev, SND_SEQ_EVFLG_CONNECTION) |
666 | /** event type check: sample messages */ |
667 | #define snd_seq_ev_is_sample_type(ev) \ |
668 | snd_seq_type_check(ev, SND_SEQ_EVFLG_SAMPLE) |
669 | /** event type check: user-defined messages */ |
670 | #define snd_seq_ev_is_user_type(ev) \ |
671 | snd_seq_type_check(ev, SND_SEQ_EVFLG_USERS) |
672 | /** event type check: instrument layer events */ |
673 | #define snd_seq_ev_is_instr_type(ev) \ |
674 | snd_seq_type_check(ev, SND_SEQ_EVFLG_INSTR) |
675 | /** event type check: fixed length events */ |
676 | #define snd_seq_ev_is_fixed_type(ev) \ |
677 | snd_seq_type_check(ev, SND_SEQ_EVFLG_FIXED) |
678 | /** event type check: variable length events */ |
679 | #define snd_seq_ev_is_variable_type(ev) \ |
680 | snd_seq_type_check(ev, SND_SEQ_EVFLG_VARIABLE) |
681 | /** event type check: user pointer events */ |
682 | #define snd_seq_ev_is_varusr_type(ev) \ |
683 | snd_seq_type_check(ev, SND_SEQ_EVFLG_VARUSR) |
684 | /** event type check: reserved for kernel */ |
685 | #define snd_seq_ev_is_reserved(ev) \ |
686 | (! snd_seq_event_types[(ev)->type]) |
687 | |
688 | /** |
689 | * macros to check event flags |
690 | */ |
691 | /** prior events */ |
692 | #define snd_seq_ev_is_prior(ev) \ |
693 | (((ev)->flags & SND_SEQ_PRIORITY_MASK) == SND_SEQ_PRIORITY_HIGH) |
694 | |
695 | /** get the data length type */ |
696 | #define snd_seq_ev_length_type(ev) \ |
697 | ((ev)->flags & SND_SEQ_EVENT_LENGTH_MASK) |
698 | /** fixed length events */ |
699 | #define snd_seq_ev_is_fixed(ev) \ |
700 | (snd_seq_ev_length_type(ev) == SND_SEQ_EVENT_LENGTH_FIXED) |
701 | /** variable length events */ |
702 | #define snd_seq_ev_is_variable(ev) \ |
703 | (snd_seq_ev_length_type(ev) == SND_SEQ_EVENT_LENGTH_VARIABLE) |
704 | /** variable length on user-space */ |
705 | #define snd_seq_ev_is_varusr(ev) \ |
706 | (snd_seq_ev_length_type(ev) == SND_SEQ_EVENT_LENGTH_VARUSR) |
707 | |
708 | /** time-stamp type */ |
709 | #define snd_seq_ev_timestamp_type(ev) \ |
710 | ((ev)->flags & SND_SEQ_TIME_STAMP_MASK) |
711 | /** event is in tick time */ |
712 | #define snd_seq_ev_is_tick(ev) \ |
713 | (snd_seq_ev_timestamp_type(ev) == SND_SEQ_TIME_STAMP_TICK) |
714 | /** event is in real-time */ |
715 | #define snd_seq_ev_is_real(ev) \ |
716 | (snd_seq_ev_timestamp_type(ev) == SND_SEQ_TIME_STAMP_REAL) |
717 | |
718 | /** time-mode type */ |
719 | #define snd_seq_ev_timemode_type(ev) \ |
720 | ((ev)->flags & SND_SEQ_TIME_MODE_MASK) |
721 | /** scheduled in absolute time */ |
722 | #define snd_seq_ev_is_abstime(ev) \ |
723 | (snd_seq_ev_timemode_type(ev) == SND_SEQ_TIME_MODE_ABS) |
724 | /** scheduled in relative time */ |
725 | #define snd_seq_ev_is_reltime(ev) \ |
726 | (snd_seq_ev_timemode_type(ev) == SND_SEQ_TIME_MODE_REL) |
727 | |
728 | /** direct dispatched events */ |
729 | #define snd_seq_ev_is_direct(ev) \ |
730 | ((ev)->queue == SND_SEQ_QUEUE_DIRECT) |
731 | |
732 | /** \} */ |
733 | |
734 | #ifdef __cplusplus |
735 | } |
736 | #endif |
737 | |
738 | #endif /* __ALSA_SEQ_H */ |
739 | |
740 | |