home *** CD-ROM | disk | FTP | other *** search
/ ftp.ee.lbl.gov / 2014.05.ftp.ee.lbl.gov.tar / ftp.ee.lbl.gov / bmd-1.0beta.tar.Z / bmd-1.0beta.tar / bmd-1.0beta / app / omtd / track.c < prev    next >
C/C++ Source or Header  |  1991-08-21  |  4KB  |  229 lines

  1. /*
  2.  * Copyright (c) 1990 Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms are permitted
  6.  * provided that the above copyright notice and this paragraph are
  7.  * duplicated in all such forms and that any documentation,
  8.  * advertising materials, and other materials related to such
  9.  * distribution and use acknowledge that the software was developed
  10.  * by the University of California, Lawrence Berkeley Laboratory,
  11.  * Berkeley, CA.  The name of the University may not be used to
  12.  * endorse or promote products derived from this software without
  13.  * specific prior written permission.
  14.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
  15.  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
  16.  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  17.  */
  18.  
  19. #include <sys/types.h>
  20. #include <sundev/midi.h>
  21. #include "track.h"
  22. #include "readline.h"
  23. #include "event.h"
  24. #include "setting.h"
  25.  
  26. struct track *trklist;
  27.  
  28. free_tracks()
  29. {
  30.     struct track *p, *next;
  31.  
  32.     for (p = trklist; p != 0; p = next) {
  33.         next = p->next;
  34.         free((char *)p);
  35.     }
  36.     trklist = 0;
  37. }
  38.  
  39. delete_command(trk)
  40.     struct track *trk;
  41. {
  42.     struct track **pp;
  43.  
  44.     if (trk == 0)
  45.         return;
  46.  
  47.     for (pp = &trklist; *pp != 0; pp = &(*pp)->next) {
  48.         if (*pp == trk) {
  49.             *pp = (*pp)->next;
  50.             free((void *)trk);
  51.             return;
  52.         }
  53.     }
  54. }
  55.  
  56. struct track *
  57. get_track(name)
  58.     char *name;
  59. {
  60.     struct track *p;
  61.  
  62.     for (p = trklist; p != 0; p = p->next)
  63.         if (p->name == name)
  64.             return p;
  65.  
  66.     return 0;
  67. }
  68.  
  69. struct track *
  70. lookup_track(name, chan)
  71.     char *name;
  72.     int  chan;
  73. {
  74.     struct track *p = get_track(name);
  75.  
  76.     if (p == 0) {
  77.         p = (struct track *)malloc(sizeof(*p));
  78.         bzero((char *)p, sizeof(*p));
  79.         p->name = name;
  80.         p->channel = chan;
  81.         p->next = trklist;
  82.         p->id = trklist ? trklist->id + 1 : 0;
  83.         trklist = p;
  84.     }
  85.     return p;
  86. }
  87.  
  88. struct track *
  89. find_track(name)
  90.     char *name;
  91. {
  92.     struct track *trk = get_track(name);
  93.  
  94.     if (trk == 0)
  95.         printf("no track named '%s'\n", name);
  96.     return trk;
  97. }
  98.  
  99. static int
  100. trkcnt(trk)
  101.     struct track *trk;
  102. {
  103.     struct event *p;
  104.     int n = 0;
  105.  
  106.     for (p = master_list; p != 0; p = p->next)
  107.         if (trk == p->trk)
  108.             ++n;
  109.     return n;
  110. }
  111.  
  112. void
  113. tracks_command()
  114. {
  115.     struct track *p;
  116.  
  117.     for (p = trklist; p != 0; p = p->next)
  118.         printf("\"%s\"\t%s\tchan %d\t#%d\n", p->name, 
  119.                p->mute ? "off" : "on", p->channel + 1,
  120.                trkcnt(p));
  121. }
  122.  
  123. count_tracks(p)
  124.     struct track *p;
  125. {
  126.     if (p == 0)
  127.         return 0;
  128.     else {
  129.         p->id = count_tracks(p->next);
  130.         return p->id + 1;
  131.     }
  132. }
  133.  
  134. write_tracks(fd)
  135.     int fd;
  136. {
  137.     int cnt = 0, strings = 0;
  138.     struct track *p;
  139.  
  140.     if (trklist == 0) {
  141.         (void)write(fd, &cnt, sizeof cnt);
  142.         return;
  143.     }
  144.     cnt = count_tracks(trklist);
  145.     (void)write(fd, &cnt, sizeof cnt);
  146.  
  147.     for (p = trklist; p != 0; p = p->next) {
  148.         char c = strlen(p->name);
  149.         (void)write(fd, &c, 1);
  150.         (void)write(fd, p->name, strlen(p->name));
  151.         (void)write(fd, &p->mute, sizeof p->mute);
  152.         (void)write(fd, &p->channel, sizeof p->channel);
  153.     }
  154. }
  155.  
  156. read_tracks(fd)
  157.     int fd;
  158. {
  159.     int cnt = 0;
  160.     struct track *p, **pp;
  161.     char len;
  162.     char buf[80];
  163.  
  164.     pp = &trklist;
  165.     if (read(fd, &cnt, sizeof cnt) != sizeof(cnt)) {
  166.     }
  167.     while (--cnt >= 0) {
  168.         if (read(fd, &len, 1) != 1) {
  169.         }
  170.         if (read(fd, buf, len) != len) {
  171.         }
  172.         buf[len] = 0;
  173.         p = (struct track *)malloc(sizeof(*p));
  174.         p->id = cnt;
  175.         p->name = intern(buf);
  176.         read(fd, &p->mute, sizeof p->mute);
  177.         read(fd, &p->channel, sizeof p->channel);
  178.         *pp = p;
  179.         pp = &p->next;
  180.     }
  181.     *pp = 0;
  182. }
  183.  
  184. struct track *
  185. id_to_track(id)
  186.     int id;
  187. {
  188.     struct track *p;
  189.     char name[30];
  190.  
  191.     for (p = trklist; p != 0; p = p->next)
  192.         if (p->id == id)
  193.             return p;
  194.  
  195.     abort();
  196.     sprintf(name, "trk%d", id);
  197.     p = lookup_track(intern(name), 0);
  198.     p->id = id;
  199.  
  200.     return p;
  201. }
  202.  
  203. void
  204. save_mutes()
  205. {
  206.     struct track *p;
  207.  
  208.     for (p = trklist; p != 0; p = p->next) 
  209.         p->smute = p->mute;
  210. }
  211.  
  212. void
  213. mute_all()
  214. {
  215.     struct track *p;
  216.  
  217.     for (p = trklist; p != 0; p = p->next) 
  218.         p->mute = 1;
  219. }
  220.  
  221. void
  222. restore_mutes()
  223. {
  224.     struct track *p;
  225.  
  226.     for (p = trklist; p != 0; p = p->next) 
  227.         p->mute = p->smute;
  228. }
  229.