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