1d5ac70f0Sopenharmony_ci#include <stdlib.h> 2d5ac70f0Sopenharmony_ci#include <string.h> 3d5ac70f0Sopenharmony_ci#include <errno.h> 4d5ac70f0Sopenharmony_ci#include <regex.h> 5d5ac70f0Sopenharmony_ci#include "test.h" 6d5ac70f0Sopenharmony_ci 7d5ac70f0Sopenharmony_ci/* 8d5ac70f0Sopenharmony_ci * Checks whether the regular expression matches the entire MIDI data, printed 9d5ac70f0Sopenharmony_ci * as hex. 10d5ac70f0Sopenharmony_ci */ 11d5ac70f0Sopenharmony_cistatic int midi_matches_regex(unsigned char *midi, int count, const char *regex) 12d5ac70f0Sopenharmony_ci{ 13d5ac70f0Sopenharmony_ci char *text; 14d5ac70f0Sopenharmony_ci regex_t re; 15d5ac70f0Sopenharmony_ci regmatch_t match; 16d5ac70f0Sopenharmony_ci int i; 17d5ac70f0Sopenharmony_ci 18d5ac70f0Sopenharmony_ci text = malloc(2 * count + 1); 19d5ac70f0Sopenharmony_ci if (!text) 20d5ac70f0Sopenharmony_ci return 0; 21d5ac70f0Sopenharmony_ci for (i = 0; i < count; ++i) 22d5ac70f0Sopenharmony_ci sprintf(text + 2 * i, "%02x", midi[i]); 23d5ac70f0Sopenharmony_ci if (regcomp(&re, regex, REG_EXTENDED) != 0) { 24d5ac70f0Sopenharmony_ci free(text); 25d5ac70f0Sopenharmony_ci return 0; 26d5ac70f0Sopenharmony_ci } 27d5ac70f0Sopenharmony_ci i = regexec(&re, text, 1, &match, 0); 28d5ac70f0Sopenharmony_ci i = i == 0 && match.rm_so == 0 && match.rm_eo == strlen(text); 29d5ac70f0Sopenharmony_ci regfree(&re); 30d5ac70f0Sopenharmony_ci free(text); 31d5ac70f0Sopenharmony_ci return i; 32d5ac70f0Sopenharmony_ci} 33d5ac70f0Sopenharmony_ci 34d5ac70f0Sopenharmony_cistatic void test_decode(void) 35d5ac70f0Sopenharmony_ci{ 36d5ac70f0Sopenharmony_ci snd_midi_event_t *midi_event; 37d5ac70f0Sopenharmony_ci snd_seq_event_t ev; 38d5ac70f0Sopenharmony_ci unsigned char buf[50]; 39d5ac70f0Sopenharmony_ci int count; 40d5ac70f0Sopenharmony_ci 41d5ac70f0Sopenharmony_ci if (ALSA_CHECK(snd_midi_event_new(256 /* ? */, &midi_event)) < 0) 42d5ac70f0Sopenharmony_ci return; 43d5ac70f0Sopenharmony_ci 44d5ac70f0Sopenharmony_ci#define DECODE() snd_midi_event_decode(midi_event, buf, sizeof(buf), &ev) 45d5ac70f0Sopenharmony_ci#define BUF_MATCHES(str) midi_matches_regex(buf, count, str) 46d5ac70f0Sopenharmony_ci#define DECODES_TO(str) ((count = DECODE()), BUF_MATCHES(str)) 47d5ac70f0Sopenharmony_ci 48d5ac70f0Sopenharmony_ci snd_seq_ev_clear(&ev); 49d5ac70f0Sopenharmony_ci 50d5ac70f0Sopenharmony_ci snd_seq_ev_set_fixed(&ev); 51d5ac70f0Sopenharmony_ci ev.type = SND_SEQ_EVENT_NONE; 52d5ac70f0Sopenharmony_ci TEST_CHECK(DECODE() == -ENOENT); 53d5ac70f0Sopenharmony_ci 54d5ac70f0Sopenharmony_ci snd_seq_ev_set_noteoff(&ev, 1, 2, 3); 55d5ac70f0Sopenharmony_ci TEST_CHECK(DECODES_TO("810203")); 56d5ac70f0Sopenharmony_ci 57d5ac70f0Sopenharmony_ci snd_seq_ev_set_noteon(&ev, 4, 5, 6); 58d5ac70f0Sopenharmony_ci TEST_CHECK(DECODES_TO("940506")); 59d5ac70f0Sopenharmony_ci 60d5ac70f0Sopenharmony_ci snd_seq_ev_set_keypress(&ev, 7, 8, 9); 61d5ac70f0Sopenharmony_ci TEST_CHECK(DECODES_TO("a70809")); 62d5ac70f0Sopenharmony_ci 63d5ac70f0Sopenharmony_ci snd_seq_ev_set_controller(&ev, 10, 11, 12); 64d5ac70f0Sopenharmony_ci TEST_CHECK(DECODES_TO("ba0b0c")); 65d5ac70f0Sopenharmony_ci 66d5ac70f0Sopenharmony_ci snd_seq_ev_set_pgmchange(&ev, 13, 14); 67d5ac70f0Sopenharmony_ci TEST_CHECK(DECODES_TO("cd0e")); 68d5ac70f0Sopenharmony_ci 69d5ac70f0Sopenharmony_ci snd_seq_ev_set_chanpress(&ev, 15, 16); 70d5ac70f0Sopenharmony_ci TEST_CHECK(DECODES_TO("df10")); 71d5ac70f0Sopenharmony_ci 72d5ac70f0Sopenharmony_ci snd_seq_ev_set_pitchbend(&ev, 1, 0x222); 73d5ac70f0Sopenharmony_ci TEST_CHECK(DECODES_TO("e12244")); 74d5ac70f0Sopenharmony_ci 75d5ac70f0Sopenharmony_ci snd_seq_ev_set_sysex(&ev, 6, "\xf0\x7e\x7f\x06\x01\xf7"); 76d5ac70f0Sopenharmony_ci TEST_CHECK(DECODES_TO("f07e7f0601f7")); 77d5ac70f0Sopenharmony_ci 78d5ac70f0Sopenharmony_ci snd_seq_ev_set_fixed(&ev); 79d5ac70f0Sopenharmony_ci ev.type = SND_SEQ_EVENT_QFRAME; 80d5ac70f0Sopenharmony_ci ev.data.control.value = 3; 81d5ac70f0Sopenharmony_ci TEST_CHECK(DECODES_TO("f103")); 82d5ac70f0Sopenharmony_ci 83d5ac70f0Sopenharmony_ci ev.type = SND_SEQ_EVENT_SONGPOS; 84d5ac70f0Sopenharmony_ci ev.data.control.value = 0x444; 85d5ac70f0Sopenharmony_ci TEST_CHECK(DECODES_TO("f24408")); 86d5ac70f0Sopenharmony_ci 87d5ac70f0Sopenharmony_ci ev.type = SND_SEQ_EVENT_SONGSEL; 88d5ac70f0Sopenharmony_ci ev.data.control.value = 5; 89d5ac70f0Sopenharmony_ci TEST_CHECK(DECODES_TO("f305")); 90d5ac70f0Sopenharmony_ci 91d5ac70f0Sopenharmony_ci ev.type = SND_SEQ_EVENT_TUNE_REQUEST; 92d5ac70f0Sopenharmony_ci TEST_CHECK(DECODES_TO("f6")); 93d5ac70f0Sopenharmony_ci 94d5ac70f0Sopenharmony_ci ev.type = SND_SEQ_EVENT_CLOCK; 95d5ac70f0Sopenharmony_ci TEST_CHECK(DECODES_TO("f8")); 96d5ac70f0Sopenharmony_ci 97d5ac70f0Sopenharmony_ci ev.type = SND_SEQ_EVENT_START; 98d5ac70f0Sopenharmony_ci TEST_CHECK(DECODES_TO("fa")); 99d5ac70f0Sopenharmony_ci 100d5ac70f0Sopenharmony_ci ev.type = SND_SEQ_EVENT_CONTINUE; 101d5ac70f0Sopenharmony_ci TEST_CHECK(DECODES_TO("fb")); 102d5ac70f0Sopenharmony_ci 103d5ac70f0Sopenharmony_ci ev.type = SND_SEQ_EVENT_STOP; 104d5ac70f0Sopenharmony_ci TEST_CHECK(DECODES_TO("fc")); 105d5ac70f0Sopenharmony_ci 106d5ac70f0Sopenharmony_ci ev.type = SND_SEQ_EVENT_SENSING; 107d5ac70f0Sopenharmony_ci TEST_CHECK(DECODES_TO("fe")); 108d5ac70f0Sopenharmony_ci 109d5ac70f0Sopenharmony_ci ev.type = SND_SEQ_EVENT_RESET; 110d5ac70f0Sopenharmony_ci TEST_CHECK(DECODES_TO("ff")); 111d5ac70f0Sopenharmony_ci 112d5ac70f0Sopenharmony_ci ev.type = SND_SEQ_EVENT_CONTROL14; 113d5ac70f0Sopenharmony_ci ev.data.control.channel = 6; 114d5ac70f0Sopenharmony_ci ev.data.control.param = 7; 115d5ac70f0Sopenharmony_ci ev.data.control.value = 0x888; 116d5ac70f0Sopenharmony_ci /* 117d5ac70f0Sopenharmony_ci * This regular expression catches all allowed combinations of LSB/MSB 118d5ac70f0Sopenharmony_ci * order and running status. 119d5ac70f0Sopenharmony_ci */ 120d5ac70f0Sopenharmony_ci TEST_CHECK(DECODES_TO("b6(0711(b6)?2708|2708(b6)?0711)")); 121d5ac70f0Sopenharmony_ci 122d5ac70f0Sopenharmony_ci ev.type = SND_SEQ_EVENT_NONREGPARAM; 123d5ac70f0Sopenharmony_ci ev.data.control.channel = 9; 124d5ac70f0Sopenharmony_ci ev.data.control.param = 0xaaa; 125d5ac70f0Sopenharmony_ci ev.data.control.value = 0xbbb; 126d5ac70f0Sopenharmony_ci TEST_CHECK(DECODES_TO("b9(622a(b9)?6315|6315(b9)?622a)(b9)?(0617(b9)?263b|263b(b9)?0617)")); 127d5ac70f0Sopenharmony_ci 128d5ac70f0Sopenharmony_ci ev.type = SND_SEQ_EVENT_REGPARAM; 129d5ac70f0Sopenharmony_ci ev.data.control.channel = 12; 130d5ac70f0Sopenharmony_ci ev.data.control.param = 0xddd; 131d5ac70f0Sopenharmony_ci ev.data.control.value = 0xeee; 132d5ac70f0Sopenharmony_ci TEST_CHECK(DECODES_TO("bc(645d(bc)?651b|651b(bc)?645d)(bc)?(061d(bc)?266e|266e(bc)?061d)")); 133d5ac70f0Sopenharmony_ci 134d5ac70f0Sopenharmony_ci /* no running status after SysEx */ 135d5ac70f0Sopenharmony_ci snd_seq_ev_set_pgmchange(&ev, 0, 0x11); 136d5ac70f0Sopenharmony_ci TEST_CHECK(DECODES_TO("c011")); 137d5ac70f0Sopenharmony_ci snd_seq_ev_set_sysex(&ev, 6, "\xf0\x7e\x7f\x09\x02\xf7"); 138d5ac70f0Sopenharmony_ci TEST_CHECK(DECODES_TO("f07e7f0902f7")); 139d5ac70f0Sopenharmony_ci snd_seq_ev_set_pgmchange(&ev, 0, 0x11); 140d5ac70f0Sopenharmony_ci TEST_CHECK(DECODES_TO("c011")); 141d5ac70f0Sopenharmony_ci 142d5ac70f0Sopenharmony_ci /* no running status for non-realtime common messages */ 143d5ac70f0Sopenharmony_ci ev.type = SND_SEQ_EVENT_QFRAME; 144d5ac70f0Sopenharmony_ci ev.data.control.value = 0x11; 145d5ac70f0Sopenharmony_ci TEST_CHECK(DECODES_TO("f111")); 146d5ac70f0Sopenharmony_ci TEST_CHECK(DECODES_TO("f111")); 147d5ac70f0Sopenharmony_ci 148d5ac70f0Sopenharmony_ci /* buffer overflow */ 149d5ac70f0Sopenharmony_ci TEST_CHECK(snd_midi_event_decode(midi_event, buf, 1, &ev) == -ENOMEM); 150d5ac70f0Sopenharmony_ci 151d5ac70f0Sopenharmony_ci snd_midi_event_free(midi_event); 152d5ac70f0Sopenharmony_ci} 153d5ac70f0Sopenharmony_ci 154d5ac70f0Sopenharmony_cistatic void test_reset_decode(void) 155d5ac70f0Sopenharmony_ci{ 156d5ac70f0Sopenharmony_ci snd_midi_event_t *midi_event; 157d5ac70f0Sopenharmony_ci snd_seq_event_t ev; 158d5ac70f0Sopenharmony_ci unsigned char buf[50]; 159d5ac70f0Sopenharmony_ci int count; 160d5ac70f0Sopenharmony_ci 161d5ac70f0Sopenharmony_ci if (ALSA_CHECK(snd_midi_event_new(256 /* ? */, &midi_event)) < 0) 162d5ac70f0Sopenharmony_ci return; 163d5ac70f0Sopenharmony_ci 164d5ac70f0Sopenharmony_ci snd_seq_ev_clear(&ev); 165d5ac70f0Sopenharmony_ci 166d5ac70f0Sopenharmony_ci snd_seq_ev_set_noteon(&ev, 1, 2, 3); 167d5ac70f0Sopenharmony_ci TEST_CHECK(DECODES_TO("910203")); 168d5ac70f0Sopenharmony_ci 169d5ac70f0Sopenharmony_ci snd_midi_event_reset_decode(midi_event); 170d5ac70f0Sopenharmony_ci 171d5ac70f0Sopenharmony_ci TEST_CHECK(DECODES_TO("910203")); 172d5ac70f0Sopenharmony_ci 173d5ac70f0Sopenharmony_ci snd_midi_event_free(midi_event); 174d5ac70f0Sopenharmony_ci} 175d5ac70f0Sopenharmony_ci 176d5ac70f0Sopenharmony_cistatic void test_encode(void) 177d5ac70f0Sopenharmony_ci{ 178d5ac70f0Sopenharmony_ci snd_midi_event_t *midi_event; 179d5ac70f0Sopenharmony_ci snd_seq_event_t ev; 180d5ac70f0Sopenharmony_ci 181d5ac70f0Sopenharmony_ci if (ALSA_CHECK(snd_midi_event_new(256, &midi_event)) < 0) 182d5ac70f0Sopenharmony_ci return; 183d5ac70f0Sopenharmony_ci 184d5ac70f0Sopenharmony_ci#define ENCODE(str) snd_midi_event_encode(midi_event, \ 185d5ac70f0Sopenharmony_ci (const unsigned char *)str, \ 186d5ac70f0Sopenharmony_ci sizeof(str) - 1, &ev) 187d5ac70f0Sopenharmony_ci TEST_CHECK(ENCODE("\x81\x02\x03") == 3); 188d5ac70f0Sopenharmony_ci TEST_CHECK(ev.type == SND_SEQ_EVENT_NOTEOFF); 189d5ac70f0Sopenharmony_ci TEST_CHECK((ev.flags & SND_SEQ_EVENT_LENGTH_MASK) == SND_SEQ_EVENT_LENGTH_FIXED); 190d5ac70f0Sopenharmony_ci TEST_CHECK(ev.data.note.channel == 1); 191d5ac70f0Sopenharmony_ci TEST_CHECK(ev.data.note.note == 2); 192d5ac70f0Sopenharmony_ci TEST_CHECK(ev.data.note.velocity == 3); 193d5ac70f0Sopenharmony_ci 194d5ac70f0Sopenharmony_ci TEST_CHECK(ENCODE("\x94\x05\x06") == 3); 195d5ac70f0Sopenharmony_ci TEST_CHECK(ev.type == SND_SEQ_EVENT_NOTEON); 196d5ac70f0Sopenharmony_ci TEST_CHECK(ev.data.note.channel == 4); 197d5ac70f0Sopenharmony_ci TEST_CHECK(ev.data.note.note == 5); 198d5ac70f0Sopenharmony_ci TEST_CHECK(ev.data.note.velocity == 6); 199d5ac70f0Sopenharmony_ci 200d5ac70f0Sopenharmony_ci TEST_CHECK(ENCODE("\xa7\x08\x09") == 3); 201d5ac70f0Sopenharmony_ci TEST_CHECK(ev.type == SND_SEQ_EVENT_KEYPRESS); 202d5ac70f0Sopenharmony_ci TEST_CHECK(ev.data.note.channel == 7); 203d5ac70f0Sopenharmony_ci TEST_CHECK(ev.data.note.note == 8); 204d5ac70f0Sopenharmony_ci TEST_CHECK(ev.data.note.velocity == 9); 205d5ac70f0Sopenharmony_ci 206d5ac70f0Sopenharmony_ci TEST_CHECK(ENCODE("\xba\x0b\x0c") == 3); 207d5ac70f0Sopenharmony_ci TEST_CHECK(ev.type == SND_SEQ_EVENT_CONTROLLER); 208d5ac70f0Sopenharmony_ci TEST_CHECK(ev.data.control.channel == 10); 209d5ac70f0Sopenharmony_ci TEST_CHECK(ev.data.control.param == 11); 210d5ac70f0Sopenharmony_ci TEST_CHECK(ev.data.control.value == 12); 211d5ac70f0Sopenharmony_ci 212d5ac70f0Sopenharmony_ci TEST_CHECK(ENCODE("\xcd\x0e") == 2); 213d5ac70f0Sopenharmony_ci TEST_CHECK(ev.type == SND_SEQ_EVENT_PGMCHANGE); 214d5ac70f0Sopenharmony_ci TEST_CHECK(ev.data.control.channel == 13); 215d5ac70f0Sopenharmony_ci TEST_CHECK(ev.data.control.value == 14); 216d5ac70f0Sopenharmony_ci 217d5ac70f0Sopenharmony_ci TEST_CHECK(ENCODE("\xdf\x10") == 2); 218d5ac70f0Sopenharmony_ci TEST_CHECK(ev.type == SND_SEQ_EVENT_CHANPRESS); 219d5ac70f0Sopenharmony_ci TEST_CHECK(ev.data.control.channel == 15); 220d5ac70f0Sopenharmony_ci TEST_CHECK(ev.data.control.value == 16); 221d5ac70f0Sopenharmony_ci 222d5ac70f0Sopenharmony_ci TEST_CHECK(ENCODE("\xe1\x22\x33") == 3); 223d5ac70f0Sopenharmony_ci TEST_CHECK(ev.type == SND_SEQ_EVENT_PITCHBEND); 224d5ac70f0Sopenharmony_ci TEST_CHECK(ev.data.control.channel == 1); 225d5ac70f0Sopenharmony_ci TEST_CHECK(ev.data.control.value == -1630); 226d5ac70f0Sopenharmony_ci 227d5ac70f0Sopenharmony_ci TEST_CHECK(ENCODE("\xf0\x7f\x7f\x04\x01\x7f\x7f\xf7") == 8); 228d5ac70f0Sopenharmony_ci TEST_CHECK(ev.type == SND_SEQ_EVENT_SYSEX); 229d5ac70f0Sopenharmony_ci TEST_CHECK((ev.flags & SND_SEQ_EVENT_LENGTH_MASK) == SND_SEQ_EVENT_LENGTH_VARIABLE); 230d5ac70f0Sopenharmony_ci TEST_CHECK(ev.data.ext.len == 8); 231d5ac70f0Sopenharmony_ci TEST_CHECK(!memcmp(ev.data.ext.ptr, "\xf0\x7f\x7f\x04\x01\x7f\x7f\xf7", 8)); 232d5ac70f0Sopenharmony_ci 233d5ac70f0Sopenharmony_ci TEST_CHECK(ENCODE("\xf1\x04") == 2); 234d5ac70f0Sopenharmony_ci TEST_CHECK(ev.type == SND_SEQ_EVENT_QFRAME); 235d5ac70f0Sopenharmony_ci TEST_CHECK(ev.data.control.value == 4); 236d5ac70f0Sopenharmony_ci 237d5ac70f0Sopenharmony_ci TEST_CHECK(ENCODE("\xf2\x55\x66") == 3); 238d5ac70f0Sopenharmony_ci TEST_CHECK(ev.type == SND_SEQ_EVENT_SONGPOS); 239d5ac70f0Sopenharmony_ci TEST_CHECK(ev.data.control.value == 13141); 240d5ac70f0Sopenharmony_ci 241d5ac70f0Sopenharmony_ci TEST_CHECK(ENCODE("\xf3\x07") == 2); 242d5ac70f0Sopenharmony_ci TEST_CHECK(ev.type == SND_SEQ_EVENT_SONGSEL); 243d5ac70f0Sopenharmony_ci TEST_CHECK(ev.data.control.value == 7); 244d5ac70f0Sopenharmony_ci 245d5ac70f0Sopenharmony_ci TEST_CHECK(ENCODE("\xf6") == 1); 246d5ac70f0Sopenharmony_ci TEST_CHECK(ev.type == SND_SEQ_EVENT_TUNE_REQUEST); 247d5ac70f0Sopenharmony_ci 248d5ac70f0Sopenharmony_ci TEST_CHECK(ENCODE("\xf8") == 1); 249d5ac70f0Sopenharmony_ci TEST_CHECK(ev.type == SND_SEQ_EVENT_CLOCK); 250d5ac70f0Sopenharmony_ci 251d5ac70f0Sopenharmony_ci TEST_CHECK(ENCODE("\xfa") == 1); 252d5ac70f0Sopenharmony_ci TEST_CHECK(ev.type == SND_SEQ_EVENT_START); 253d5ac70f0Sopenharmony_ci 254d5ac70f0Sopenharmony_ci TEST_CHECK(ENCODE("\xfb") == 1); 255d5ac70f0Sopenharmony_ci TEST_CHECK(ev.type == SND_SEQ_EVENT_CONTINUE); 256d5ac70f0Sopenharmony_ci 257d5ac70f0Sopenharmony_ci TEST_CHECK(ENCODE("\xfc") == 1); 258d5ac70f0Sopenharmony_ci TEST_CHECK(ev.type == SND_SEQ_EVENT_STOP); 259d5ac70f0Sopenharmony_ci 260d5ac70f0Sopenharmony_ci TEST_CHECK(ENCODE("\xfe") == 1); 261d5ac70f0Sopenharmony_ci TEST_CHECK(ev.type == SND_SEQ_EVENT_SENSING); 262d5ac70f0Sopenharmony_ci 263d5ac70f0Sopenharmony_ci TEST_CHECK(ENCODE("\xff") == 1); 264d5ac70f0Sopenharmony_ci TEST_CHECK(ev.type == SND_SEQ_EVENT_RESET); 265d5ac70f0Sopenharmony_ci 266d5ac70f0Sopenharmony_ci TEST_CHECK(ENCODE("\xc1\xf8") == 2); 267d5ac70f0Sopenharmony_ci TEST_CHECK(ev.type == SND_SEQ_EVENT_CLOCK); 268d5ac70f0Sopenharmony_ci TEST_CHECK(ENCODE("\x22") == 1); 269d5ac70f0Sopenharmony_ci TEST_CHECK(ev.type == SND_SEQ_EVENT_PGMCHANGE); 270d5ac70f0Sopenharmony_ci TEST_CHECK(ev.data.control.channel == 1); 271d5ac70f0Sopenharmony_ci TEST_CHECK(ev.data.control.value == 0x22); 272d5ac70f0Sopenharmony_ci TEST_CHECK(ENCODE("\xf8") == 1); 273d5ac70f0Sopenharmony_ci TEST_CHECK(ev.type == SND_SEQ_EVENT_CLOCK); 274d5ac70f0Sopenharmony_ci TEST_CHECK(ENCODE("\x33") == 1); 275d5ac70f0Sopenharmony_ci TEST_CHECK(ev.type == SND_SEQ_EVENT_PGMCHANGE); 276d5ac70f0Sopenharmony_ci TEST_CHECK(ev.data.control.channel == 1); 277d5ac70f0Sopenharmony_ci TEST_CHECK(ev.data.control.value == 0x33); 278d5ac70f0Sopenharmony_ci 279d5ac70f0Sopenharmony_ci TEST_CHECK(ENCODE("\xc1\xf6") == 2); 280d5ac70f0Sopenharmony_ci TEST_CHECK(ev.type == SND_SEQ_EVENT_TUNE_REQUEST); 281d5ac70f0Sopenharmony_ci TEST_CHECK(ENCODE("\x44\x44") == 2); 282d5ac70f0Sopenharmony_ci TEST_CHECK(ev.type == SND_SEQ_EVENT_NONE); 283d5ac70f0Sopenharmony_ci 284d5ac70f0Sopenharmony_ci snd_midi_event_free(midi_event); 285d5ac70f0Sopenharmony_ci} 286d5ac70f0Sopenharmony_ci 287d5ac70f0Sopenharmony_cistatic void test_reset_encode(void) 288d5ac70f0Sopenharmony_ci{ 289d5ac70f0Sopenharmony_ci snd_midi_event_t *midi_event; 290d5ac70f0Sopenharmony_ci snd_seq_event_t ev; 291d5ac70f0Sopenharmony_ci 292d5ac70f0Sopenharmony_ci if (ALSA_CHECK(snd_midi_event_new(256, &midi_event)) < 0) 293d5ac70f0Sopenharmony_ci return; 294d5ac70f0Sopenharmony_ci 295d5ac70f0Sopenharmony_ci TEST_CHECK(ENCODE("\x91\x02") == 2); 296d5ac70f0Sopenharmony_ci TEST_CHECK(ev.type == SND_SEQ_EVENT_NONE); 297d5ac70f0Sopenharmony_ci 298d5ac70f0Sopenharmony_ci snd_midi_event_reset_encode(midi_event); 299d5ac70f0Sopenharmony_ci 300d5ac70f0Sopenharmony_ci TEST_CHECK(ENCODE("\x03") == 1); 301d5ac70f0Sopenharmony_ci TEST_CHECK(ev.type == SND_SEQ_EVENT_NONE); 302d5ac70f0Sopenharmony_ci 303d5ac70f0Sopenharmony_ci snd_midi_event_free(midi_event); 304d5ac70f0Sopenharmony_ci} 305d5ac70f0Sopenharmony_ci 306d5ac70f0Sopenharmony_cistatic void test_init(void) 307d5ac70f0Sopenharmony_ci{ 308d5ac70f0Sopenharmony_ci snd_midi_event_t *midi_event; 309d5ac70f0Sopenharmony_ci snd_seq_event_t ev; 310d5ac70f0Sopenharmony_ci unsigned char buf[50]; 311d5ac70f0Sopenharmony_ci int count; 312d5ac70f0Sopenharmony_ci 313d5ac70f0Sopenharmony_ci if (ALSA_CHECK(snd_midi_event_new(256, &midi_event)) < 0) 314d5ac70f0Sopenharmony_ci return; 315d5ac70f0Sopenharmony_ci 316d5ac70f0Sopenharmony_ci snd_seq_ev_set_noteon(&ev, 1, 2, 3); 317d5ac70f0Sopenharmony_ci TEST_CHECK(DECODES_TO("910203")); 318d5ac70f0Sopenharmony_ci 319d5ac70f0Sopenharmony_ci TEST_CHECK(ENCODE("\x94\x05") == 2); 320d5ac70f0Sopenharmony_ci TEST_CHECK(ev.type == SND_SEQ_EVENT_NONE); 321d5ac70f0Sopenharmony_ci 322d5ac70f0Sopenharmony_ci snd_midi_event_init(midi_event); 323d5ac70f0Sopenharmony_ci 324d5ac70f0Sopenharmony_ci snd_seq_ev_set_noteon(&ev, 1, 2, 3); 325d5ac70f0Sopenharmony_ci TEST_CHECK(DECODES_TO("910203")); 326d5ac70f0Sopenharmony_ci 327d5ac70f0Sopenharmony_ci TEST_CHECK(ENCODE("\x06") == 1); 328d5ac70f0Sopenharmony_ci TEST_CHECK(ev.type == SND_SEQ_EVENT_NONE); 329d5ac70f0Sopenharmony_ci 330d5ac70f0Sopenharmony_ci snd_midi_event_free(midi_event); 331d5ac70f0Sopenharmony_ci} 332d5ac70f0Sopenharmony_ci 333d5ac70f0Sopenharmony_cistatic void test_encode_byte(void) 334d5ac70f0Sopenharmony_ci{ 335d5ac70f0Sopenharmony_ci snd_midi_event_t *midi_event; 336d5ac70f0Sopenharmony_ci snd_seq_event_t ev; 337d5ac70f0Sopenharmony_ci 338d5ac70f0Sopenharmony_ci if (ALSA_CHECK(snd_midi_event_new(256, &midi_event)) < 0) 339d5ac70f0Sopenharmony_ci return; 340d5ac70f0Sopenharmony_ci 341d5ac70f0Sopenharmony_ci#define ENCODE_BYTE(c) snd_midi_event_encode_byte(midi_event, c, &ev) 342d5ac70f0Sopenharmony_ci TEST_CHECK(ENCODE_BYTE(0x81) == 0); 343d5ac70f0Sopenharmony_ci TEST_CHECK(ENCODE_BYTE(0x02) == 0); 344d5ac70f0Sopenharmony_ci TEST_CHECK(ENCODE_BYTE(0x03) == 1); 345d5ac70f0Sopenharmony_ci TEST_CHECK(ev.type == SND_SEQ_EVENT_NOTEOFF); 346d5ac70f0Sopenharmony_ci TEST_CHECK((ev.flags & SND_SEQ_EVENT_LENGTH_MASK) == SND_SEQ_EVENT_LENGTH_FIXED); 347d5ac70f0Sopenharmony_ci TEST_CHECK(ev.data.note.channel == 1); 348d5ac70f0Sopenharmony_ci TEST_CHECK(ev.data.note.note == 2); 349d5ac70f0Sopenharmony_ci TEST_CHECK(ev.data.note.velocity == 3); 350d5ac70f0Sopenharmony_ci TEST_CHECK(ENCODE_BYTE(0x04) == 0); 351d5ac70f0Sopenharmony_ci TEST_CHECK(ENCODE_BYTE(0xf8) == 1); 352d5ac70f0Sopenharmony_ci TEST_CHECK(ev.type == SND_SEQ_EVENT_CLOCK); 353d5ac70f0Sopenharmony_ci TEST_CHECK(ENCODE_BYTE(0x05) == 1); 354d5ac70f0Sopenharmony_ci TEST_CHECK(ev.type == SND_SEQ_EVENT_NOTEOFF); 355d5ac70f0Sopenharmony_ci TEST_CHECK(ev.data.note.channel == 1); 356d5ac70f0Sopenharmony_ci TEST_CHECK(ev.data.note.note == 4); 357d5ac70f0Sopenharmony_ci TEST_CHECK(ev.data.note.velocity == 5); 358d5ac70f0Sopenharmony_ci 359d5ac70f0Sopenharmony_ci snd_midi_event_free(midi_event); 360d5ac70f0Sopenharmony_ci} 361d5ac70f0Sopenharmony_ci 362d5ac70f0Sopenharmony_ciint main(void) 363d5ac70f0Sopenharmony_ci{ 364d5ac70f0Sopenharmony_ci test_decode(); 365d5ac70f0Sopenharmony_ci test_reset_decode(); 366d5ac70f0Sopenharmony_ci test_encode(); 367d5ac70f0Sopenharmony_ci test_reset_encode(); 368d5ac70f0Sopenharmony_ci test_encode_byte(); 369d5ac70f0Sopenharmony_ci test_init(); 370d5ac70f0Sopenharmony_ci return TEST_EXIT_CODE(); 371d5ac70f0Sopenharmony_ci} 372