1d5ac70f0Sopenharmony_ci/**
2d5ac70f0Sopenharmony_ci * \file include/seqmid.h
3d5ac70f0Sopenharmony_ci * \brief Application interface library for the ALSA driver
4d5ac70f0Sopenharmony_ci * \author Jaroslav Kysela <perex@perex.cz>
5d5ac70f0Sopenharmony_ci * \author Abramo Bagnara <abramo@alsa-project.org>
6d5ac70f0Sopenharmony_ci * \author Takashi Iwai <tiwai@suse.de>
7d5ac70f0Sopenharmony_ci * \date 1998-2001
8d5ac70f0Sopenharmony_ci *
9d5ac70f0Sopenharmony_ci * Application interface library for the ALSA driver
10d5ac70f0Sopenharmony_ci */
11d5ac70f0Sopenharmony_ci/*
12d5ac70f0Sopenharmony_ci *   This library is free software; you can redistribute it and/or modify
13d5ac70f0Sopenharmony_ci *   it under the terms of the GNU Lesser General Public License as
14d5ac70f0Sopenharmony_ci *   published by the Free Software Foundation; either version 2.1 of
15d5ac70f0Sopenharmony_ci *   the License, or (at your option) any later version.
16d5ac70f0Sopenharmony_ci *
17d5ac70f0Sopenharmony_ci *   This program is distributed in the hope that it will be useful,
18d5ac70f0Sopenharmony_ci *   but WITHOUT ANY WARRANTY; without even the implied warranty of
19d5ac70f0Sopenharmony_ci *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20d5ac70f0Sopenharmony_ci *   GNU Lesser General Public License for more details.
21d5ac70f0Sopenharmony_ci *
22d5ac70f0Sopenharmony_ci *   You should have received a copy of the GNU Lesser General Public
23d5ac70f0Sopenharmony_ci *   License along with this library; if not, write to the Free Software
24d5ac70f0Sopenharmony_ci *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
25d5ac70f0Sopenharmony_ci *
26d5ac70f0Sopenharmony_ci */
27d5ac70f0Sopenharmony_ci
28d5ac70f0Sopenharmony_ci#ifndef __ALSA_SEQMID_H
29d5ac70f0Sopenharmony_ci#define __ALSA_SEQMID_H
30d5ac70f0Sopenharmony_ci
31d5ac70f0Sopenharmony_ci#ifdef __cplusplus
32d5ac70f0Sopenharmony_ciextern "C" {
33d5ac70f0Sopenharmony_ci#endif
34d5ac70f0Sopenharmony_ci
35d5ac70f0Sopenharmony_ci/**
36d5ac70f0Sopenharmony_ci *  \defgroup SeqMiddle Sequencer Middle Level Interface
37d5ac70f0Sopenharmony_ci *  Sequencer Middle Level Interface
38d5ac70f0Sopenharmony_ci *  \ingroup Sequencer
39d5ac70f0Sopenharmony_ci *  \{
40d5ac70f0Sopenharmony_ci */
41d5ac70f0Sopenharmony_ci
42d5ac70f0Sopenharmony_ci/**
43d5ac70f0Sopenharmony_ci * \brief initialize event record
44d5ac70f0Sopenharmony_ci * \param ev event record pointer
45d5ac70f0Sopenharmony_ci *
46d5ac70f0Sopenharmony_ci * This macro clears the given event record pointer to the default status.
47d5ac70f0Sopenharmony_ci */
48d5ac70f0Sopenharmony_cistatic inline void snd_seq_ev_clear(snd_seq_event_t *ev)
49d5ac70f0Sopenharmony_ci{
50d5ac70f0Sopenharmony_ci	memset(ev, 0, sizeof(*ev));
51d5ac70f0Sopenharmony_ci}
52d5ac70f0Sopenharmony_ci
53d5ac70f0Sopenharmony_ci/**
54d5ac70f0Sopenharmony_ci * \brief initialize event record for UMP
55d5ac70f0Sopenharmony_ci * \param ev event record pointer
56d5ac70f0Sopenharmony_ci *
57d5ac70f0Sopenharmony_ci * This macro clears the given UMP event record pointer to the default status.
58d5ac70f0Sopenharmony_ci */
59d5ac70f0Sopenharmony_cistatic inline void snd_seq_ump_ev_clear(snd_seq_ump_event_t *ev)
60d5ac70f0Sopenharmony_ci{
61d5ac70f0Sopenharmony_ci	memset(ev, 0, sizeof(*ev));
62d5ac70f0Sopenharmony_ci}
63d5ac70f0Sopenharmony_ci
64d5ac70f0Sopenharmony_ci/**
65d5ac70f0Sopenharmony_ci * \brief set the tag for given event
66d5ac70f0Sopenharmony_ci * \param ev event record
67d5ac70f0Sopenharmony_ci * \param t event tag
68d5ac70f0Sopenharmony_ci *
69d5ac70f0Sopenharmony_ci * This macro sets the tag to the given event record.
70d5ac70f0Sopenharmony_ci */
71d5ac70f0Sopenharmony_ci#define snd_seq_ev_set_tag(ev,t) \
72d5ac70f0Sopenharmony_ci	((ev)->tag = (t))
73d5ac70f0Sopenharmony_ci
74d5ac70f0Sopenharmony_ci/**
75d5ac70f0Sopenharmony_ci * \brief set the explicit destination
76d5ac70f0Sopenharmony_ci * \param ev event record
77d5ac70f0Sopenharmony_ci * \param c destination client id
78d5ac70f0Sopenharmony_ci * \param p destination port id
79d5ac70f0Sopenharmony_ci *
80d5ac70f0Sopenharmony_ci * This macro sets the client and port id numbers to the given event record.
81d5ac70f0Sopenharmony_ci *
82d5ac70f0Sopenharmony_ci * \sa snd_seq_ev_set_subs()
83d5ac70f0Sopenharmony_ci */
84d5ac70f0Sopenharmony_ci#define snd_seq_ev_set_dest(ev,c,p) \
85d5ac70f0Sopenharmony_ci	((ev)->dest.client = (c), (ev)->dest.port = (p))
86d5ac70f0Sopenharmony_ci
87d5ac70f0Sopenharmony_ci/**
88d5ac70f0Sopenharmony_ci * \brief set broadcasting to subscribers
89d5ac70f0Sopenharmony_ci * \param ev event record
90d5ac70f0Sopenharmony_ci *
91d5ac70f0Sopenharmony_ci * This macro sets the destination as the subscribers.
92d5ac70f0Sopenharmony_ci *
93d5ac70f0Sopenharmony_ci * \sa snd_seq_ev_set_dest()
94d5ac70f0Sopenharmony_ci */
95d5ac70f0Sopenharmony_ci#define snd_seq_ev_set_subs(ev) \
96d5ac70f0Sopenharmony_ci	((ev)->dest.client = SND_SEQ_ADDRESS_SUBSCRIBERS,\
97d5ac70f0Sopenharmony_ci	 (ev)->dest.port = SND_SEQ_ADDRESS_UNKNOWN)
98d5ac70f0Sopenharmony_ci
99d5ac70f0Sopenharmony_ci/**
100d5ac70f0Sopenharmony_ci * \brief set broadcasting to all clients/ports
101d5ac70f0Sopenharmony_ci * \param ev event record
102d5ac70f0Sopenharmony_ci *
103d5ac70f0Sopenharmony_ci * This macro sets the destination as the broadcasting.
104d5ac70f0Sopenharmony_ci *
105d5ac70f0Sopenharmony_ci * \sa snd_seq_ev_set_dest()
106d5ac70f0Sopenharmony_ci */
107d5ac70f0Sopenharmony_ci#define snd_seq_ev_set_broadcast(ev) \
108d5ac70f0Sopenharmony_ci	((ev)->dest.client = SND_SEQ_ADDRESS_BROADCAST,\
109d5ac70f0Sopenharmony_ci	 (ev)->dest.port = SND_SEQ_ADDRESS_BROADCAST)
110d5ac70f0Sopenharmony_ci
111d5ac70f0Sopenharmony_ci/**
112d5ac70f0Sopenharmony_ci * \brief set the source port
113d5ac70f0Sopenharmony_ci * \param ev event record
114d5ac70f0Sopenharmony_ci * \param p source port id
115d5ac70f0Sopenharmony_ci *
116d5ac70f0Sopenharmony_ci * This macro sets the source port id number.
117d5ac70f0Sopenharmony_ci */
118d5ac70f0Sopenharmony_ci#define snd_seq_ev_set_source(ev,p) \
119d5ac70f0Sopenharmony_ci	((ev)->source.port = (p))
120d5ac70f0Sopenharmony_ci
121d5ac70f0Sopenharmony_ci/**
122d5ac70f0Sopenharmony_ci * \brief set direct passing mode (without queued)
123d5ac70f0Sopenharmony_ci * \param ev event instance
124d5ac70f0Sopenharmony_ci *
125d5ac70f0Sopenharmony_ci * This macro sets the event to the direct passing mode
126d5ac70f0Sopenharmony_ci * to be delivered immediately without queueing.
127d5ac70f0Sopenharmony_ci *
128d5ac70f0Sopenharmony_ci * \sa snd_seq_ev_schedule_tick(), snd_seq_ev_schedule_real()
129d5ac70f0Sopenharmony_ci */
130d5ac70f0Sopenharmony_ci#define snd_seq_ev_set_direct(ev) \
131d5ac70f0Sopenharmony_ci	((ev)->queue = SND_SEQ_QUEUE_DIRECT)
132d5ac70f0Sopenharmony_ci
133d5ac70f0Sopenharmony_ci/**
134d5ac70f0Sopenharmony_ci * \brief set tick-scheduling mode on queue
135d5ac70f0Sopenharmony_ci * \param ev event instance
136d5ac70f0Sopenharmony_ci * \param q queue id to schedule
137d5ac70f0Sopenharmony_ci * \param relative relative time-stamp if non-zero
138d5ac70f0Sopenharmony_ci * \param ttick tick time-stamp to be delivered
139d5ac70f0Sopenharmony_ci *
140d5ac70f0Sopenharmony_ci * This macro sets the scheduling of the event in the
141d5ac70f0Sopenharmony_ci * MIDI tick mode.
142d5ac70f0Sopenharmony_ci *
143d5ac70f0Sopenharmony_ci * \sa snd_seq_ev_schedule_real(), snd_seq_ev_set_direct()
144d5ac70f0Sopenharmony_ci */
145d5ac70f0Sopenharmony_ci#define snd_seq_ev_schedule_tick(ev, q, relative, ttick) \
146d5ac70f0Sopenharmony_ci	((ev)->flags &= ~(SND_SEQ_TIME_STAMP_MASK | SND_SEQ_TIME_MODE_MASK),\
147d5ac70f0Sopenharmony_ci	 (ev)->flags |= SND_SEQ_TIME_STAMP_TICK,\
148d5ac70f0Sopenharmony_ci	 (ev)->flags |= (relative) ? SND_SEQ_TIME_MODE_REL : SND_SEQ_TIME_MODE_ABS,\
149d5ac70f0Sopenharmony_ci	 (ev)->time.tick = (ttick),\
150d5ac70f0Sopenharmony_ci	 (ev)->queue = (q))
151d5ac70f0Sopenharmony_ci
152d5ac70f0Sopenharmony_ci/**
153d5ac70f0Sopenharmony_ci * \brief set real-time-scheduling mode on queue
154d5ac70f0Sopenharmony_ci * \param ev event instance
155d5ac70f0Sopenharmony_ci * \param q queue id to schedule
156d5ac70f0Sopenharmony_ci * \param relative relative time-stamp if non-zero
157d5ac70f0Sopenharmony_ci * \param rtime time-stamp to be delivered
158d5ac70f0Sopenharmony_ci *
159d5ac70f0Sopenharmony_ci * This macro sets the scheduling of the event in the
160d5ac70f0Sopenharmony_ci * realtime mode.
161d5ac70f0Sopenharmony_ci *
162d5ac70f0Sopenharmony_ci * \sa snd_seq_ev_schedule_tick(), snd_seq_ev_set_direct()
163d5ac70f0Sopenharmony_ci */
164d5ac70f0Sopenharmony_ci#define snd_seq_ev_schedule_real(ev, q, relative, rtime) \
165d5ac70f0Sopenharmony_ci	((ev)->flags &= ~(SND_SEQ_TIME_STAMP_MASK | SND_SEQ_TIME_MODE_MASK),\
166d5ac70f0Sopenharmony_ci	 (ev)->flags |= SND_SEQ_TIME_STAMP_REAL,\
167d5ac70f0Sopenharmony_ci	 (ev)->flags |= (relative) ? SND_SEQ_TIME_MODE_REL : SND_SEQ_TIME_MODE_ABS,\
168d5ac70f0Sopenharmony_ci	 (ev)->time.time = *(rtime),\
169d5ac70f0Sopenharmony_ci	 (ev)->queue = (q))
170d5ac70f0Sopenharmony_ci
171d5ac70f0Sopenharmony_ci/**
172d5ac70f0Sopenharmony_ci * \brief set event priority
173d5ac70f0Sopenharmony_ci * \param ev event instance
174d5ac70f0Sopenharmony_ci * \param high_prior 1 for high priority mode
175d5ac70f0Sopenharmony_ci */
176d5ac70f0Sopenharmony_ci#define snd_seq_ev_set_priority(ev, high_prior) \
177d5ac70f0Sopenharmony_ci	((ev)->flags &= ~SND_SEQ_PRIORITY_MASK,\
178d5ac70f0Sopenharmony_ci	 (ev)->flags |= (high_prior) ? SND_SEQ_PRIORITY_HIGH : SND_SEQ_PRIORITY_NORMAL)
179d5ac70f0Sopenharmony_ci
180d5ac70f0Sopenharmony_ci/**
181d5ac70f0Sopenharmony_ci * \brief set fixed data
182d5ac70f0Sopenharmony_ci * \param ev event instance
183d5ac70f0Sopenharmony_ci *
184d5ac70f0Sopenharmony_ci * Sets the event length mode as fixed size.
185d5ac70f0Sopenharmony_ci *
186d5ac70f0Sopenharmony_ci * \sa snd_seq_ev_set_variable(), snd_seq_ev_set_varusr()
187d5ac70f0Sopenharmony_ci */
188d5ac70f0Sopenharmony_ci#define snd_seq_ev_set_fixed(ev) \
189d5ac70f0Sopenharmony_ci	((ev)->flags &= ~SND_SEQ_EVENT_LENGTH_MASK,\
190d5ac70f0Sopenharmony_ci	 (ev)->flags |= SND_SEQ_EVENT_LENGTH_FIXED)
191d5ac70f0Sopenharmony_ci
192d5ac70f0Sopenharmony_ci/**
193d5ac70f0Sopenharmony_ci * \brief set variable data
194d5ac70f0Sopenharmony_ci * \param ev event instance
195d5ac70f0Sopenharmony_ci * \param datalen length of the external data
196d5ac70f0Sopenharmony_ci * \param dataptr pointer of the external data
197d5ac70f0Sopenharmony_ci *
198d5ac70f0Sopenharmony_ci * Sets the event length mode as variable length and stores the data.
199d5ac70f0Sopenharmony_ci *
200d5ac70f0Sopenharmony_ci * \sa snd_seq_ev_set_fixed(), snd_seq_ev_set_varusr()
201d5ac70f0Sopenharmony_ci */
202d5ac70f0Sopenharmony_ci#define snd_seq_ev_set_variable(ev, datalen, dataptr) \
203d5ac70f0Sopenharmony_ci	((ev)->flags &= ~SND_SEQ_EVENT_LENGTH_MASK,\
204d5ac70f0Sopenharmony_ci	 (ev)->flags |= SND_SEQ_EVENT_LENGTH_VARIABLE,\
205d5ac70f0Sopenharmony_ci	 (ev)->data.ext.len = (datalen),\
206d5ac70f0Sopenharmony_ci	 (ev)->data.ext.ptr = (dataptr))
207d5ac70f0Sopenharmony_ci
208d5ac70f0Sopenharmony_ci/**
209d5ac70f0Sopenharmony_ci * \brief set varusr data
210d5ac70f0Sopenharmony_ci * \param ev event instance
211d5ac70f0Sopenharmony_ci * \param datalen length of the external data
212d5ac70f0Sopenharmony_ci * \param dataptr pointer of the external data
213d5ac70f0Sopenharmony_ci *
214d5ac70f0Sopenharmony_ci * Sets the event length mode as variable user-space data and stores the data.
215d5ac70f0Sopenharmony_ci *
216d5ac70f0Sopenharmony_ci * \sa snd_seq_ev_set_fixed(), snd_seq_ev_set_variable()
217d5ac70f0Sopenharmony_ci */
218d5ac70f0Sopenharmony_ci#define snd_seq_ev_set_varusr(ev, datalen, dataptr) \
219d5ac70f0Sopenharmony_ci	((ev)->flags &= ~SND_SEQ_EVENT_LENGTH_MASK,\
220d5ac70f0Sopenharmony_ci	 (ev)->flags |= SND_SEQ_EVENT_LENGTH_VARUSR,\
221d5ac70f0Sopenharmony_ci	 (ev)->data.ext.len = (datalen),\
222d5ac70f0Sopenharmony_ci	 (ev)->data.ext.ptr = (dataptr))
223d5ac70f0Sopenharmony_ci
224d5ac70f0Sopenharmony_ci/**
225d5ac70f0Sopenharmony_ci * \brief set queue controls
226d5ac70f0Sopenharmony_ci * \param ev event record
227d5ac70f0Sopenharmony_ci * \param typ event type
228d5ac70f0Sopenharmony_ci * \param q queue id
229d5ac70f0Sopenharmony_ci * \param val control value
230d5ac70f0Sopenharmony_ci */
231d5ac70f0Sopenharmony_ci#define snd_seq_ev_set_queue_control(ev, typ, q, val) \
232d5ac70f0Sopenharmony_ci	((ev)->type = (typ),\
233d5ac70f0Sopenharmony_ci	 snd_seq_ev_set_dest(ev, SND_SEQ_CLIENT_SYSTEM, SND_SEQ_PORT_SYSTEM_TIMER),\
234d5ac70f0Sopenharmony_ci	 (ev)->data.queue.queue = (q),\
235d5ac70f0Sopenharmony_ci	 (ev)->data.queue.param.value = (val))
236d5ac70f0Sopenharmony_ci
237d5ac70f0Sopenharmony_ci/**
238d5ac70f0Sopenharmony_ci * \brief set the start queue event
239d5ac70f0Sopenharmony_ci * \param ev event record
240d5ac70f0Sopenharmony_ci * \param q queue id to start
241d5ac70f0Sopenharmony_ci *
242d5ac70f0Sopenharmony_ci * \sa snd_seq_ev_set_queue_stop(), snd_seq_ev_set_queue_continue()
243d5ac70f0Sopenharmony_ci */
244d5ac70f0Sopenharmony_ci#define snd_seq_ev_set_queue_start(ev, q) \
245d5ac70f0Sopenharmony_ci	snd_seq_ev_set_queue_control(ev, SND_SEQ_EVENT_START, q, 0)
246d5ac70f0Sopenharmony_ci
247d5ac70f0Sopenharmony_ci/**
248d5ac70f0Sopenharmony_ci * \brief set the stop queue event
249d5ac70f0Sopenharmony_ci * \param ev event record
250d5ac70f0Sopenharmony_ci * \param q queue id to stop
251d5ac70f0Sopenharmony_ci *
252d5ac70f0Sopenharmony_ci * \sa snd_seq_ev_set_queue_start(), snd_seq_ev_set_queue_continue()
253d5ac70f0Sopenharmony_ci */
254d5ac70f0Sopenharmony_ci#define snd_seq_ev_set_queue_stop(ev, q) \
255d5ac70f0Sopenharmony_ci	snd_seq_ev_set_queue_control(ev, SND_SEQ_EVENT_STOP, q, 0)
256d5ac70f0Sopenharmony_ci
257d5ac70f0Sopenharmony_ci/**
258d5ac70f0Sopenharmony_ci * \brief set the stop queue event
259d5ac70f0Sopenharmony_ci * \param ev event record
260d5ac70f0Sopenharmony_ci * \param q queue id to continue
261d5ac70f0Sopenharmony_ci *
262d5ac70f0Sopenharmony_ci * \sa snd_seq_ev_set_queue_start(), snd_seq_ev_set_queue_stop()
263d5ac70f0Sopenharmony_ci */
264d5ac70f0Sopenharmony_ci#define snd_seq_ev_set_queue_continue(ev, q) \
265d5ac70f0Sopenharmony_ci	snd_seq_ev_set_queue_control(ev, SND_SEQ_EVENT_CONTINUE, q, 0)
266d5ac70f0Sopenharmony_ci
267d5ac70f0Sopenharmony_ci/**
268d5ac70f0Sopenharmony_ci * \brief set the stop queue event
269d5ac70f0Sopenharmony_ci * \param ev event record
270d5ac70f0Sopenharmony_ci * \param q queue id to change tempo
271d5ac70f0Sopenharmony_ci * \param val the new tempo value
272d5ac70f0Sopenharmony_ci */
273d5ac70f0Sopenharmony_ci#define snd_seq_ev_set_queue_tempo(ev, q, val) \
274d5ac70f0Sopenharmony_ci	snd_seq_ev_set_queue_control(ev, SND_SEQ_EVENT_TEMPO, q, val)
275d5ac70f0Sopenharmony_ci
276d5ac70f0Sopenharmony_ci/**
277d5ac70f0Sopenharmony_ci * \brief set the real-time position of a queue
278d5ac70f0Sopenharmony_ci * \param ev event record
279d5ac70f0Sopenharmony_ci * \param q queue id to change tempo
280d5ac70f0Sopenharmony_ci * \param rtime the new real-time pointer
281d5ac70f0Sopenharmony_ci */
282d5ac70f0Sopenharmony_ci#define snd_seq_ev_set_queue_pos_real(ev, q, rtime) \
283d5ac70f0Sopenharmony_ci	((ev)->type = SND_SEQ_EVENT_SETPOS_TIME,\
284d5ac70f0Sopenharmony_ci	 snd_seq_ev_set_dest(ev, SND_SEQ_CLIENT_SYSTEM, SND_SEQ_PORT_SYSTEM_TIMER),\
285d5ac70f0Sopenharmony_ci	 (ev)->data.queue.queue = (q),\
286d5ac70f0Sopenharmony_ci	 (ev)->data.queue.param.time.time = *(rtime))
287d5ac70f0Sopenharmony_ci
288d5ac70f0Sopenharmony_ci/**
289d5ac70f0Sopenharmony_ci * \brief set the tick-time position of a queue
290d5ac70f0Sopenharmony_ci * \param ev event record
291d5ac70f0Sopenharmony_ci * \param q queue id to change tempo
292d5ac70f0Sopenharmony_ci * \param ttime the new tick-time
293d5ac70f0Sopenharmony_ci */
294d5ac70f0Sopenharmony_ci#define snd_seq_ev_set_queue_pos_tick(ev, q, ttime) \
295d5ac70f0Sopenharmony_ci	((ev)->type = SND_SEQ_EVENT_SETPOS_TICK,\
296d5ac70f0Sopenharmony_ci	 snd_seq_ev_set_dest(ev, SND_SEQ_CLIENT_SYSTEM, SND_SEQ_PORT_SYSTEM_TIMER),\
297d5ac70f0Sopenharmony_ci	 (ev)->data.queue.queue = (q),\
298d5ac70f0Sopenharmony_ci	 (ev)->data.queue.param.time.tick = (ttime))
299d5ac70f0Sopenharmony_ci
300d5ac70f0Sopenharmony_ci/**
301d5ac70f0Sopenharmony_ci * \brief set the event UMP flag
302d5ac70f0Sopenharmony_ci * \param ev event record
303d5ac70f0Sopenharmony_ci */
304d5ac70f0Sopenharmony_cistatic inline void snd_seq_ev_set_ump(snd_seq_ump_event_t *ev)
305d5ac70f0Sopenharmony_ci{
306d5ac70f0Sopenharmony_ci	ev->flags |= SND_SEQ_EVENT_UMP;
307d5ac70f0Sopenharmony_ci	ev->type = 0; /* unused for UMP */
308d5ac70f0Sopenharmony_ci}
309d5ac70f0Sopenharmony_ci
310d5ac70f0Sopenharmony_ci/**
311d5ac70f0Sopenharmony_ci * \brief set the event UMP flag and fill UMP raw bytes
312d5ac70f0Sopenharmony_ci * \param ev event record
313d5ac70f0Sopenharmony_ci * \param data UMP packet data
314d5ac70f0Sopenharmony_ci * \param bytes UMP packet size in bytes
315d5ac70f0Sopenharmony_ci */
316d5ac70f0Sopenharmony_cistatic inline int snd_seq_ev_set_ump_data(snd_seq_ump_event_t *ev, void *data, size_t bytes)
317d5ac70f0Sopenharmony_ci{
318d5ac70f0Sopenharmony_ci	if (bytes > 16)
319d5ac70f0Sopenharmony_ci		return -EINVAL;
320d5ac70f0Sopenharmony_ci	snd_seq_ev_set_ump(ev);
321d5ac70f0Sopenharmony_ci	memcpy(ev->ump, data, bytes);
322d5ac70f0Sopenharmony_ci	return 0;
323d5ac70f0Sopenharmony_ci}
324d5ac70f0Sopenharmony_ci
325d5ac70f0Sopenharmony_ci/* set and send a queue control event */
326d5ac70f0Sopenharmony_ciint snd_seq_control_queue(snd_seq_t *seq, int q, int type, int value, snd_seq_event_t *ev);
327d5ac70f0Sopenharmony_ci
328d5ac70f0Sopenharmony_ci/**
329d5ac70f0Sopenharmony_ci * \brief start the specified queue
330d5ac70f0Sopenharmony_ci * \param seq sequencer handle
331d5ac70f0Sopenharmony_ci * \param q queue id to start
332d5ac70f0Sopenharmony_ci * \param ev optional event record (see #snd_seq_control_queue)
333d5ac70f0Sopenharmony_ci */
334d5ac70f0Sopenharmony_ci#define snd_seq_start_queue(seq, q, ev) \
335d5ac70f0Sopenharmony_ci	snd_seq_control_queue(seq, q, SND_SEQ_EVENT_START, 0, ev)
336d5ac70f0Sopenharmony_ci
337d5ac70f0Sopenharmony_ci/**
338d5ac70f0Sopenharmony_ci * \brief stop the specified queue
339d5ac70f0Sopenharmony_ci * \param seq sequencer handle
340d5ac70f0Sopenharmony_ci * \param q queue id to stop
341d5ac70f0Sopenharmony_ci * \param ev optional event record (see #snd_seq_control_queue)
342d5ac70f0Sopenharmony_ci */
343d5ac70f0Sopenharmony_ci#define snd_seq_stop_queue(seq, q, ev) \
344d5ac70f0Sopenharmony_ci	snd_seq_control_queue(seq, q, SND_SEQ_EVENT_STOP, 0, ev)
345d5ac70f0Sopenharmony_ci
346d5ac70f0Sopenharmony_ci/**
347d5ac70f0Sopenharmony_ci * \brief continue the specified queue
348d5ac70f0Sopenharmony_ci * \param seq sequencer handle
349d5ac70f0Sopenharmony_ci * \param q queue id to continue
350d5ac70f0Sopenharmony_ci * \param ev optional event record (see #snd_seq_control_queue)
351d5ac70f0Sopenharmony_ci */
352d5ac70f0Sopenharmony_ci#define snd_seq_continue_queue(seq, q, ev) \
353d5ac70f0Sopenharmony_ci	snd_seq_control_queue(seq, q, SND_SEQ_EVENT_CONTINUE, 0, ev)
354d5ac70f0Sopenharmony_ci
355d5ac70f0Sopenharmony_ci/**
356d5ac70f0Sopenharmony_ci * \brief change the tempo of the specified queue
357d5ac70f0Sopenharmony_ci * \param seq sequencer handle
358d5ac70f0Sopenharmony_ci * \param q queue id
359d5ac70f0Sopenharmony_ci * \param tempo the new tempo value
360d5ac70f0Sopenharmony_ci * \param ev optional event record (see #snd_seq_control_queue)
361d5ac70f0Sopenharmony_ci */
362d5ac70f0Sopenharmony_ci#define snd_seq_change_queue_tempo(seq, q, tempo, ev) \
363d5ac70f0Sopenharmony_ci	snd_seq_control_queue(seq, q, SND_SEQ_EVENT_TEMPO, tempo, ev)
364d5ac70f0Sopenharmony_ci
365d5ac70f0Sopenharmony_ci/* create a port - simple version - return the port number */
366d5ac70f0Sopenharmony_ciint snd_seq_create_simple_port(snd_seq_t *seq, const char *name,
367d5ac70f0Sopenharmony_ci			       unsigned int caps, unsigned int type);
368d5ac70f0Sopenharmony_ci/* delete the port */
369d5ac70f0Sopenharmony_ciint snd_seq_delete_simple_port(snd_seq_t *seq, int port);
370d5ac70f0Sopenharmony_ci
371d5ac70f0Sopenharmony_ci/* simple subscription between this port and another port
372d5ac70f0Sopenharmony_ci   (w/o exclusive & time conversion)
373d5ac70f0Sopenharmony_ci   */
374d5ac70f0Sopenharmony_ciint snd_seq_connect_from(snd_seq_t *seq, int my_port, int src_client, int src_port);
375d5ac70f0Sopenharmony_ciint snd_seq_connect_to(snd_seq_t *seq, int my_port, int dest_client, int dest_port);
376d5ac70f0Sopenharmony_ciint snd_seq_disconnect_from(snd_seq_t *seq, int my_port, int src_client, int src_port);
377d5ac70f0Sopenharmony_ciint snd_seq_disconnect_to(snd_seq_t *seq, int my_port, int dest_client, int dest_port);
378d5ac70f0Sopenharmony_ci
379d5ac70f0Sopenharmony_ci/*
380d5ac70f0Sopenharmony_ci * set client information
381d5ac70f0Sopenharmony_ci */
382d5ac70f0Sopenharmony_ciint snd_seq_set_client_name(snd_seq_t *seq, const char *name);
383d5ac70f0Sopenharmony_ciint snd_seq_set_client_event_filter(snd_seq_t *seq, int event_type);
384d5ac70f0Sopenharmony_ciint snd_seq_set_client_midi_version(snd_seq_t *seq, int midi_version);
385d5ac70f0Sopenharmony_ciint snd_seq_set_client_ump_conversion(snd_seq_t *seq, int enable);
386d5ac70f0Sopenharmony_ciint snd_seq_set_client_pool_output(snd_seq_t *seq, size_t size);
387d5ac70f0Sopenharmony_ciint snd_seq_set_client_pool_output_room(snd_seq_t *seq, size_t size);
388d5ac70f0Sopenharmony_ciint snd_seq_set_client_pool_input(snd_seq_t *seq, size_t size);
389d5ac70f0Sopenharmony_ci/* sync output queue */
390d5ac70f0Sopenharmony_ciint snd_seq_sync_output_queue(snd_seq_t *seq);
391d5ac70f0Sopenharmony_ci
392d5ac70f0Sopenharmony_ci/*
393d5ac70f0Sopenharmony_ci * parse the given string and get the sequencer address
394d5ac70f0Sopenharmony_ci */
395d5ac70f0Sopenharmony_ciint snd_seq_parse_address(snd_seq_t *seq, snd_seq_addr_t *addr, const char *str);
396d5ac70f0Sopenharmony_ci
397d5ac70f0Sopenharmony_ci/*
398d5ac70f0Sopenharmony_ci * reset client input/output pool
399d5ac70f0Sopenharmony_ci */
400d5ac70f0Sopenharmony_ciint snd_seq_reset_pool_output(snd_seq_t *seq);
401d5ac70f0Sopenharmony_ciint snd_seq_reset_pool_input(snd_seq_t *seq);
402d5ac70f0Sopenharmony_ci
403d5ac70f0Sopenharmony_ci/**
404d5ac70f0Sopenharmony_ci * \brief set note event
405d5ac70f0Sopenharmony_ci * \param ev event record
406d5ac70f0Sopenharmony_ci * \param ch channel number
407d5ac70f0Sopenharmony_ci * \param key note key
408d5ac70f0Sopenharmony_ci * \param vel velocity
409d5ac70f0Sopenharmony_ci * \param dur duration (in tick or msec)
410d5ac70f0Sopenharmony_ci */
411d5ac70f0Sopenharmony_ci#define snd_seq_ev_set_note(ev, ch, key, vel, dur) \
412d5ac70f0Sopenharmony_ci	((ev)->type = SND_SEQ_EVENT_NOTE,\
413d5ac70f0Sopenharmony_ci	 snd_seq_ev_set_fixed(ev),\
414d5ac70f0Sopenharmony_ci	 (ev)->data.note.channel = (ch),\
415d5ac70f0Sopenharmony_ci	 (ev)->data.note.note = (key),\
416d5ac70f0Sopenharmony_ci	 (ev)->data.note.velocity = (vel),\
417d5ac70f0Sopenharmony_ci	 (ev)->data.note.duration = (dur))
418d5ac70f0Sopenharmony_ci
419d5ac70f0Sopenharmony_ci/**
420d5ac70f0Sopenharmony_ci * \brief set note-on event
421d5ac70f0Sopenharmony_ci * \param ev event record
422d5ac70f0Sopenharmony_ci * \param ch channel number
423d5ac70f0Sopenharmony_ci * \param key note key
424d5ac70f0Sopenharmony_ci * \param vel velocity
425d5ac70f0Sopenharmony_ci */
426d5ac70f0Sopenharmony_ci#define snd_seq_ev_set_noteon(ev, ch, key, vel) \
427d5ac70f0Sopenharmony_ci	((ev)->type = SND_SEQ_EVENT_NOTEON,\
428d5ac70f0Sopenharmony_ci	 snd_seq_ev_set_fixed(ev),\
429d5ac70f0Sopenharmony_ci	 (ev)->data.note.channel = (ch),\
430d5ac70f0Sopenharmony_ci	 (ev)->data.note.note = (key),\
431d5ac70f0Sopenharmony_ci	 (ev)->data.note.velocity = (vel))
432d5ac70f0Sopenharmony_ci
433d5ac70f0Sopenharmony_ci/**
434d5ac70f0Sopenharmony_ci * \brief set note-off event
435d5ac70f0Sopenharmony_ci * \param ev event record
436d5ac70f0Sopenharmony_ci * \param ch channel number
437d5ac70f0Sopenharmony_ci * \param key note key
438d5ac70f0Sopenharmony_ci * \param vel velocity
439d5ac70f0Sopenharmony_ci */
440d5ac70f0Sopenharmony_ci#define snd_seq_ev_set_noteoff(ev, ch, key, vel) \
441d5ac70f0Sopenharmony_ci	((ev)->type = SND_SEQ_EVENT_NOTEOFF,\
442d5ac70f0Sopenharmony_ci	 snd_seq_ev_set_fixed(ev),\
443d5ac70f0Sopenharmony_ci	 (ev)->data.note.channel = (ch),\
444d5ac70f0Sopenharmony_ci	 (ev)->data.note.note = (key),\
445d5ac70f0Sopenharmony_ci	 (ev)->data.note.velocity = (vel))
446d5ac70f0Sopenharmony_ci
447d5ac70f0Sopenharmony_ci/**
448d5ac70f0Sopenharmony_ci * \brief set key-pressure event
449d5ac70f0Sopenharmony_ci * \param ev event record
450d5ac70f0Sopenharmony_ci * \param ch channel number
451d5ac70f0Sopenharmony_ci * \param key note key
452d5ac70f0Sopenharmony_ci * \param vel velocity
453d5ac70f0Sopenharmony_ci */
454d5ac70f0Sopenharmony_ci#define snd_seq_ev_set_keypress(ev,ch,key,vel) \
455d5ac70f0Sopenharmony_ci	((ev)->type = SND_SEQ_EVENT_KEYPRESS,\
456d5ac70f0Sopenharmony_ci	 snd_seq_ev_set_fixed(ev),\
457d5ac70f0Sopenharmony_ci	 (ev)->data.note.channel = (ch),\
458d5ac70f0Sopenharmony_ci	 (ev)->data.note.note = (key),\
459d5ac70f0Sopenharmony_ci	 (ev)->data.note.velocity = (vel))
460d5ac70f0Sopenharmony_ci
461d5ac70f0Sopenharmony_ci/**
462d5ac70f0Sopenharmony_ci * \brief set MIDI controller event
463d5ac70f0Sopenharmony_ci * \param ev event record
464d5ac70f0Sopenharmony_ci * \param ch channel number
465d5ac70f0Sopenharmony_ci * \param cc controller number
466d5ac70f0Sopenharmony_ci * \param val control value
467d5ac70f0Sopenharmony_ci */
468d5ac70f0Sopenharmony_ci#define snd_seq_ev_set_controller(ev,ch,cc,val) \
469d5ac70f0Sopenharmony_ci	((ev)->type = SND_SEQ_EVENT_CONTROLLER,\
470d5ac70f0Sopenharmony_ci	 snd_seq_ev_set_fixed(ev),\
471d5ac70f0Sopenharmony_ci	 (ev)->data.control.channel = (ch),\
472d5ac70f0Sopenharmony_ci	 (ev)->data.control.param = (cc),\
473d5ac70f0Sopenharmony_ci	 (ev)->data.control.value = (val))
474d5ac70f0Sopenharmony_ci
475d5ac70f0Sopenharmony_ci/**
476d5ac70f0Sopenharmony_ci * \brief set program change event
477d5ac70f0Sopenharmony_ci * \param ev event record
478d5ac70f0Sopenharmony_ci * \param ch channel number
479d5ac70f0Sopenharmony_ci * \param val program number
480d5ac70f0Sopenharmony_ci */
481d5ac70f0Sopenharmony_ci#define snd_seq_ev_set_pgmchange(ev,ch,val) \
482d5ac70f0Sopenharmony_ci	((ev)->type = SND_SEQ_EVENT_PGMCHANGE,\
483d5ac70f0Sopenharmony_ci	 snd_seq_ev_set_fixed(ev),\
484d5ac70f0Sopenharmony_ci	 (ev)->data.control.channel = (ch),\
485d5ac70f0Sopenharmony_ci	 (ev)->data.control.value = (val))
486d5ac70f0Sopenharmony_ci
487d5ac70f0Sopenharmony_ci/**
488d5ac70f0Sopenharmony_ci * \brief set pitch-bend event
489d5ac70f0Sopenharmony_ci * \param ev event record
490d5ac70f0Sopenharmony_ci * \param ch channel number
491d5ac70f0Sopenharmony_ci * \param val pitch bend; zero centered from -8192 to 8191
492d5ac70f0Sopenharmony_ci */
493d5ac70f0Sopenharmony_ci#define snd_seq_ev_set_pitchbend(ev,ch,val) \
494d5ac70f0Sopenharmony_ci	((ev)->type = SND_SEQ_EVENT_PITCHBEND,\
495d5ac70f0Sopenharmony_ci	 snd_seq_ev_set_fixed(ev),\
496d5ac70f0Sopenharmony_ci	 (ev)->data.control.channel = (ch),\
497d5ac70f0Sopenharmony_ci	 (ev)->data.control.value = (val))
498d5ac70f0Sopenharmony_ci
499d5ac70f0Sopenharmony_ci/**
500d5ac70f0Sopenharmony_ci * \brief set channel pressure event
501d5ac70f0Sopenharmony_ci * \param ev event record
502d5ac70f0Sopenharmony_ci * \param ch channel number
503d5ac70f0Sopenharmony_ci * \param val channel pressure value
504d5ac70f0Sopenharmony_ci */
505d5ac70f0Sopenharmony_ci#define snd_seq_ev_set_chanpress(ev,ch,val) \
506d5ac70f0Sopenharmony_ci	((ev)->type = SND_SEQ_EVENT_CHANPRESS,\
507d5ac70f0Sopenharmony_ci	 snd_seq_ev_set_fixed(ev),\
508d5ac70f0Sopenharmony_ci	 (ev)->data.control.channel = (ch),\
509d5ac70f0Sopenharmony_ci	 (ev)->data.control.value = (val))
510d5ac70f0Sopenharmony_ci
511d5ac70f0Sopenharmony_ci/**
512d5ac70f0Sopenharmony_ci * \brief set sysex event
513d5ac70f0Sopenharmony_ci * \param ev event record
514d5ac70f0Sopenharmony_ci * \param datalen length of sysex data
515d5ac70f0Sopenharmony_ci * \param dataptr sysex data pointer
516d5ac70f0Sopenharmony_ci *
517d5ac70f0Sopenharmony_ci * the sysex data must contain the start byte 0xf0 and the end byte 0xf7.
518d5ac70f0Sopenharmony_ci */
519d5ac70f0Sopenharmony_ci#define snd_seq_ev_set_sysex(ev,datalen,dataptr) \
520d5ac70f0Sopenharmony_ci	((ev)->type = SND_SEQ_EVENT_SYSEX,\
521d5ac70f0Sopenharmony_ci	 snd_seq_ev_set_variable(ev, datalen, dataptr))
522d5ac70f0Sopenharmony_ci
523d5ac70f0Sopenharmony_ci/** \} */
524d5ac70f0Sopenharmony_ci
525d5ac70f0Sopenharmony_ci#ifdef __cplusplus
526d5ac70f0Sopenharmony_ci}
527d5ac70f0Sopenharmony_ci#endif
528d5ac70f0Sopenharmony_ci
529d5ac70f0Sopenharmony_ci#endif /* __ALSA_SEQMID_H */
530d5ac70f0Sopenharmony_ci
531