]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/aux/esd.c
exec(2): fix prototypes
[plan9front.git] / sys / src / cmd / aux / esd.c
1 /*
2  * enlightenment sound daemon for plan9front
3  *
4  * usage: aux/listen1 -t 'tcp!*!16001' esd
5  */
6
7 #include <u.h>
8 #include <libc.h>
9
10 int     bigendian = 0;
11
12 void
13 die(char *msg)
14 {
15         exits(msg);
16 }
17
18 ulong
19 get4(void)
20 {
21         uchar buf[4];
22
23         if(readn(0, buf, 4) != 4)
24                 die("read");
25         if(bigendian)
26                 return buf[3] | buf[2]<<8 | buf[1]<<16 | buf[0]<<24;
27         else
28                 return buf[0] | buf[1]<<8 | buf[2]<<16 | buf[3]<<24;
29 }
30
31 char*
32 getname(char *buf)
33 {
34         if(readn(0, buf, 128) != 128)
35                 die("read");
36         return buf;
37 }
38
39 void
40 put4(ulong v)
41 {
42         uchar buf[4];
43
44         if(bigendian){
45                 buf[3] = v & 0xFF, v >>= 8;
46                 buf[2] = v & 0xFF, v >>= 8;
47                 buf[1] = v & 0xFF, v >>= 8;
48                 buf[0] = v & 0xFF;
49         } else {
50                 buf[0] = v & 0xFF, v >>= 8;
51                 buf[1] = v & 0xFF, v >>= 8;
52                 buf[2] = v & 0xFF, v >>= 8;
53                 buf[3] = v & 0xFF;
54         }
55         if(write(1, buf, 4) != 4)
56                 die("write");
57 }
58
59 char*
60 pcmfmt(ulong fmt, ulong rate)
61 {
62         static char buf[32];
63
64         snprint(buf, sizeof(buf), "s%dc%dr%lud",
65                 (fmt & 0x000F) == 0x01 ? 16 : 8,
66                 (fmt & 0x00F0) == 0x20 ? 2 : 1,
67                 rate);
68         return buf;
69 }
70
71 void
72 main(void)
73 {
74         ulong op, id, len, fmt, rate;
75         char buf[256];
76         int i, fd;
77
78 Init:
79         /* initial protocol */
80         if(readn(0, buf, 16) != 16)     /* key */
81                 die("read");
82         if((get4() & 0xFF) == 'E')      /* endian */
83                 bigendian = 1;
84         put4(1);
85
86         for(;;){
87                 op = get4();
88                 switch(op){
89                 case 0:         /* init */
90                 case 1:         /* lock */
91                 case 2:         /* unlock */
92                         goto Init;
93                 case 3:         /* stream-play */
94                         fmt = get4();
95                         rate = get4();
96                         getname(buf);
97                         fd = -1;
98                         /* wait 2 seconds, device might be busy */
99                         for(i=0; i<2000; i+=100){
100                                 fd = open("/dev/audio", OWRITE);
101                                 if(fd >= 0)
102                                         break;
103                                 sleep(100);
104                         }
105                         if(fd < 0)
106                                 die("open");
107                         dup(fd, 1);
108                         execl("/bin/audio/pcmconv", "pcmconv",
109                                 "-i", pcmfmt(fmt, rate), 0);
110                         die("exec");
111                         break;
112                 case 4:
113                 case 5:         /* stream-mon */
114                         fmt = get4();
115                         rate = get4();
116                         getname(buf);
117                         fd = open("/dev/audio", OREAD);
118                         if(fd < 0)
119                                 die("open");
120                         dup(fd, 0);
121                         execl("/bin/audio/pcmconv", "pcmconv",
122                                 "-o", pcmfmt(fmt, rate), 0);
123                         die("exec");
124                         break;
125                 case 6:         /* sample-cache */
126                         fmt = get4();   /* format */
127                         rate = get4();  /* rate */
128                         len = get4();   /* size */
129                         getname(buf);
130                         id = get4();    /* sample-id */
131                         if(fork() == 0){
132                                 /* TODO */
133                                 fd = open("/dev/null", OWRITE);
134                                 if(fd < 0)
135                                         die("open");
136                                 dup(fd, 1);
137                                 snprint(buf, sizeof(buf), "%lud", len);
138                                 execl("/bin/audio/pcmconv", "pcmconv",
139                                         "-l", buf,
140                                         "-i", pcmfmt(fmt, rate), 0);
141                                 die("exec");
142                         }
143                         waitpid();
144                         put4(id);
145                         break;
146                 case 7:         /* sample-free */
147                 case 8:         /* sample-play */
148                 case 9:         /* sample-loop */
149                 case 10:        /* sample-stop */
150                 case 11:        /* sample-kill */
151                         id = get4();
152                         put4(id);
153                         break;
154                 case 12:        /* standby */
155                 case 13:        /* resume */
156                         goto Init;
157                 case 14:        /* sample-getid */
158                         getname(buf);
159                         put4(0);/* sample-id */
160                         break;
161                 case 15:        /* stream-filter */
162                         fmt = get4();
163                         rate = get4();
164                         USED(fmt);
165                         USED(rate);
166                         getname(buf);
167                         put4(1);
168                         break;
169                 case 16:        /* server-info */
170                 case 17:        /* server-all-info */
171                         put4(1);        /* version */
172                         put4(44100);    /* rate */
173                         put4(0x0021);   /* fmt */
174                         if(op == 16)
175                                 break;
176                         put4(0);
177                         memset(buf, 0, sizeof(buf));
178                         if(write(1, buf, 32) != 32)
179                                 die("write");
180                         break;
181                 case 18:        /* subscribe */
182                 case 19:        /* unsubscribe */
183                         break;
184                 case 20:        /* stream-pan */
185                 case 21:        /* sample-pan */
186                         id = get4();
187                         USED(id);
188                         get4(); /* left */
189                         get4(); /* reight */
190                         put4(1);
191                         break;
192                 case 22:        /* standby-mode */
193                         get4(); /* version */
194                         put4(0);/* mode */
195                         put4(0);/* ok */
196                         break;
197                 case 23:        /* latency */
198                         put4(0);
199                 }
200         }
201 }