Lines Matching defs:d

59 	struct dev *d = arg;
62 logx(4, "%s: tick, delta = %d", d->path, delta);
64 d->sio.sum_utime += file_utime - d->sio.utime;
65 d->sio.sum_wtime += file_wtime - d->sio.wtime;
66 d->sio.wtime = file_wtime;
67 d->sio.utime = file_utime;
68 if (d->mode & MODE_PLAY)
69 d->sio.pused -= delta;
70 if (d->mode & MODE_REC)
71 d->sio.rused += delta;
73 dev_onmove(d, delta);
79 struct dev *d = arg;
81 logx(1, "%s: watchdog timeout", d->path);
82 dev_migrate(d);
83 dev_abort(d);
90 dev_sio_open(struct dev *d)
93 unsigned int rate, mode = d->reqmode & (SIO_PLAY | SIO_REC);
95 d->sio.hdl = fdpass_sio_open(d->num, mode);
96 if (d->sio.hdl == NULL) {
99 d->sio.hdl = fdpass_sio_open(d->num, SIO_PLAY);
100 if (d->sio.hdl != NULL)
103 d->sio.hdl = fdpass_sio_open(d->num, SIO_REC);
104 if (d->sio.hdl != NULL)
110 d->path, mode == SIO_PLAY ? "play-only" : "rec-only");
112 d->mode = mode;
114 d->sioctl.hdl = fdpass_sioctl_open(d->num, SIOCTL_READ | SIOCTL_WRITE);
115 if (d->sioctl.hdl == NULL)
116 logx(1, "%s: no control device", d->path);
119 par.bits = d->par.bits;
120 par.bps = d->par.bps;
121 par.sig = d->par.sig;
122 par.le = d->par.le;
123 par.msb = d->par.msb;
124 if (d->mode & SIO_PLAY)
125 par.pchan = d->pchan;
126 if (d->mode & SIO_REC)
127 par.rchan = d->rchan;
128 par.appbufsz = d->bufsz;
129 par.round = d->round;
130 par.rate = d->rate;
131 if (!sio_setpar(d->sio.hdl, &par))
133 if (!sio_getpar(d->sio.hdl, &par))
142 if (rate != d->rate) {
144 par.bits = d->par.bits;
145 par.bps = d->par.bps;
146 par.sig = d->par.sig;
147 par.le = d->par.le;
148 par.msb = d->par.msb;
150 par.pchan = d->reqpchan;
152 par.rchan = d->reqrchan;
153 par.appbufsz = d->bufsz * rate / d->rate;
154 par.round = d->round * rate / d->rate;
156 if (!sio_setpar(d->sio.hdl, &par))
158 if (!sio_getpar(d->sio.hdl, &par))
172 logx(0, "%s: %u: unsupported number of bits", d->path, par.bits);
176 logx(0, "%s: %u: unsupported sample size", d->path, par.bps);
179 if ((d->mode & SIO_PLAY) && par.pchan > NCHAN_MAX) {
180 logx(0, "%s: %u: unsupported number of play channels", d->path, par.pchan);
183 if ((d->mode & SIO_REC) && par.rchan > NCHAN_MAX) {
184 logx(0, "%s: %u: unsupported number of rec channels", d->path, par.rchan);
188 logx(0, "%s: %u: unsupported buffer size", d->path, par.bufsz);
193 logx(0, "%s: %u: unsupported block size", d->path, par.round);
197 logx(0, "%s: %u: unsupported rate", d->path, par.rate);
201 d->par.bits = par.bits;
202 d->par.bps = par.bps;
203 d->par.sig = par.sig;
204 d->par.le = par.le;
205 d->par.msb = par.msb;
206 if (d->mode & SIO_PLAY)
207 d->pchan = par.pchan;
208 if (d->mode & SIO_REC)
209 d->rchan = par.rchan;
210 d->bufsz = par.bufsz;
211 d->round = par.round;
212 d->rate = par.rate;
213 if (d->mode & MODE_PLAY)
214 d->mode |= MODE_MON;
215 sio_onmove(d->sio.hdl, dev_sio_onmove, d);
216 d->sio.file = file_new(&dev_sio_ops, d, "dev", sio_nfds(d->sio.hdl));
217 if (d->sioctl.hdl) {
218 d->sioctl.file = file_new(&dev_sioctl_ops, d, "mix",
219 sioctl_nfds(d->sioctl.hdl));
221 timo_set(&d->sio.watchdog, dev_sio_timeout, d);
222 dev_sioctl_open(d);
225 sio_close(d->sio.hdl);
226 if (d->sioctl.hdl) {
227 sioctl_close(d->sioctl.hdl);
228 d->sioctl.hdl = NULL;
234 dev_sio_close(struct dev *d)
236 dev_sioctl_close(d);
238 logx(3, "%s: closed", d->path);
240 timo_del(&d->sio.watchdog);
241 file_del(d->sio.file);
242 sio_close(d->sio.hdl);
243 if (d->sioctl.hdl) {
244 file_del(d->sioctl.file);
245 sioctl_close(d->sioctl.hdl);
246 d->sioctl.hdl = NULL;
251 dev_sio_start(struct dev *d)
253 if (!sio_start(d->sio.hdl)) {
254 logx(1, "%s: failed to start device", d->path);
257 if (d->mode & MODE_PLAY) {
258 d->sio.cstate = DEV_SIO_CYCLE;
259 d->sio.todo = 0;
261 d->sio.cstate = DEV_SIO_READ;
262 d->sio.todo = d->round * d->rchan * d->par.bps;
265 d->sio.pused = 0;
266 d->sio.rused = 0;
267 d->sio.sum_utime = 0;
268 d->sio.sum_wtime = 0;
269 d->sio.wtime = file_wtime;
270 d->sio.utime = file_utime;
271 logx(3, "%s: started", d->path);
273 timo_add(&d->sio.watchdog, WATCHDOG_USEC);
277 dev_sio_stop(struct dev *d)
279 if (!sio_eof(d->sio.hdl) && !sio_flush(d->sio.hdl)) {
280 logx(1, "%s: failed to stop device", d->path);
285 d->path, d->sio.sum_utime / 1000, d->sio.sum_wtime / 1000);
287 timo_del(&d->sio.watchdog);
293 struct dev *d = arg;
296 events = (d->sio.cstate == DEV_SIO_READ) ? POLLIN : POLLOUT;
297 return sio_pollfd(d->sio.hdl, pfd, events);
303 struct dev *d = arg;
306 events = sio_revents(d->sio.hdl, pfd);
308 d->sio.events = events;
316 struct dev *d = arg;
327 if (d->pstate != DEV_RUN)
329 switch (d->sio.cstate) {
332 if (!(d->sio.events & POLLIN)) {
333 logx(0, "%s: recording, but POLLIN not set", d->path);
336 if (d->sio.todo == 0) {
337 logx(0, "%s: can't read data", d->path);
340 if (d->prime > 0) {
341 logx(0, "%s: unexpected data", d->path);
345 base = d->decbuf ? d->decbuf : (unsigned char *)d->rbuf;
347 d->rchan * d->round * d->par.bps -
348 d->sio.todo;
349 n = sio_read(d->sio.hdl, data, d->sio.todo);
350 d->sio.todo -= n;
352 logx(4, "%s: read %u bytes, todo %u / %u", d->path,
353 n, d->sio.todo, d->round * d->rchan * d->par.bps);
355 if (d->sio.todo > 0)
358 d->sio.rused -= d->round;
359 if (d->sio.rused >= d->round) {
360 logx(2, "%s: rec hw xrun, rused = %d / %d",
361 d->path, d->sio.rused, d->bufsz);
364 d->sio.cstate = DEV_SIO_CYCLE;
367 timo_del(&d->sio.watchdog);
368 timo_add(&d->sio.watchdog, WATCHDOG_USEC);
376 if (!((d->mode & MODE_REC) && d->prime == 0) &&
377 !(d->sio.events & POLLOUT)) {
378 logx(0, "%s: cycle not at block boundary", d->path);
382 dev_cycle(d);
383 if (d->mode & MODE_PLAY) {
384 d->sio.cstate = DEV_SIO_WRITE;
385 d->sio.todo = d->round * d->pchan * d->par.bps;
388 d->sio.cstate = DEV_SIO_READ;
389 d->sio.todo = d->round * d->rchan * d->par.bps;
394 if (d->sio.todo == 0) {
395 logx(0, "%s: can't write data", d->path);
399 base = d->encbuf ? d->encbuf : (unsigned char *)DEV_PBUF(d);
401 d->pchan * d->round * d->par.bps -
402 d->sio.todo;
403 n = sio_write(d->sio.hdl, data, d->sio.todo);
404 d->sio.todo -= n;
407 d->path, n, d->sio.todo, d->round * d->pchan * d->par.bps);
409 if (d->sio.todo > 0)
412 d->sio.pused += d->round;
413 if (d->prime == 0 &&
414 d->sio.pused <= d->bufsz - d->round) {
415 logx(2, "%s: play hw xrun, pused = %d / %d",
416 d->path, d->sio.pused, d->bufsz);
418 if (d->sio.pused < 0 ||
419 d->sio.pused > d->bufsz) {
421 logx(2, "%s: out of bounds pused = %d / %d",
422 d->path, d->sio.pused, d->bufsz);
425 d->poffs += d->round;
426 if (d->poffs == d->psize)
427 d->poffs = 0;
428 if ((d->mode & MODE_REC) && d->prime == 0) {
429 d->sio.cstate = DEV_SIO_READ;
430 d->sio.todo = d->round * d->rchan * d->par.bps;
432 d->sio.cstate = DEV_SIO_CYCLE;
441 struct dev *d = arg;
444 logx(2, "%s: disconnected", d->path);
446 dev_migrate(d);
447 dev_abort(d);