Index: ev.c =================================================================== RCS file: /midish/midish/ev.c,v retrieving revision 1.68 diff -u -r1.68 ev.c --- ev.c 13 Sep 2013 08:47:05 -0000 1.68 +++ ev.c 16 Nov 2013 15:22:00 -0000 @@ -115,6 +115,12 @@ 0, EV_MAXFINE, 0, 0, NULL }, + { "marker", NULL, + 0, + 1, 0xdeadbeef, + 0, MARK_INDEX_MAX, 0, 0, + NULL + }, { NULL, NULL, 0, 0, 0, 0, 0, 0, 0, NULL }, /* unused slot */ { NULL, NULL, 0, 0, 0, 0, 0, 0, 0, NULL }, /* sysex pattern 0 */ { NULL, NULL, 0, 0, 0, 0, 0, 0, 0, NULL }, /* sysex pattern 1 */ @@ -132,11 +138,12 @@ { NULL, NULL, 0, 0, 0, 0, 0, 0, 0, NULL }, /* sysex pattern 0xd */ { NULL, NULL, 0, 0, 0, 0, 0, 0, 0, NULL }, /* sysex pattern 0xe */ { NULL, NULL, 0, 0, 0, 0, 0, 0, 0, NULL } /* sysex pattern 0xf */ - }; struct evctl evctl_tab[EV_MAXCOARSE + 1]; +char *evmark_tab[MARK_INDEX_MAX + 1]; + /* * return the 'name' of the given event */ @@ -282,6 +289,12 @@ log_puts(" "); log_putx(ev->timesig_tics); break; + case EV_MARK: + log_puts(" marker index :"); + log_putx(ev->v0); + log_puts(" marker name :"); + log_puts(evmark_tab[ev->v0]); + break; default: if (EV_ISSX(ev)) { log_puts(" "); @@ -680,7 +693,7 @@ /* * unconfigure a controller (clear its name unset set its default - * value tu "unknown") + * value to "unknown") */ void evctl_unconf(unsigned i) @@ -877,4 +890,95 @@ #endif evinfo[cmd].nranges = 0; return 1; +} + +/* + * initialize the markers table + */ +void +evmark_init(void) +{ + unsigned i; + + for (i = 0; i < MARK_INDEX_MAX + 1; i++) { + evmark_tab[i] = NULL; + } +} + +/* + * free the markers table + */ +void +evmark_done(void) +{ + unsigned i; + + for (i = 0; i < MARK_INDEX_MAX + 1; i++) { + if (evmark_tab[i] != NULL) { + str_delete(evmark_tab[i]); + } + } +} + +/* + * add a marker in the list (allocate and set name) + */ +void +evmark_conf(unsigned num, char *name) +{ + char *mark = evmark_tab[num]; + + if (name) { + mark = str_new(name); + } +} + +/* + * clear a marker (clear its name and deallocate) + */ +void +evmark_unconf(unsigned i) +{ + char *mark = evmark_tab[i]; + + if (mark != NULL) { + str_delete(mark); + mark = NULL; + } +} + +/* + * find the marker number corresponding the given name + * name. Return 1 if found, 0 if not + */ +unsigned +evmark_lookup(char *name, unsigned *ret) +{ + unsigned i; + char *mark; + + for (i = 0; i < MARK_INDEX_MAX + 1; i++) { + mark = evmark_tab[i]; + if (mark != NULL && str_eq(mark, name)) { + *ret = i; + return 1; + } + } + return 0; +} + +/* + * give the number of elements in the markers table + */ +unsigned evmark_getnb(void) +{ + unsigned i; + + for (i = 0; i < MARK_INDEX_MAX + 1; i++) { + if (evmark_tab[i] == NULL) { + return i; + } + } + cons_err("bad format of marker table"); + return 0; }