diff options
-rw-r--r-- | usr.bin/aucat/aucat.c | 40 |
1 files changed, 25 insertions, 15 deletions
diff --git a/usr.bin/aucat/aucat.c b/usr.bin/aucat/aucat.c index 5ae93d37bf8..65c444fed2e 100644 --- a/usr.bin/aucat/aucat.c +++ b/usr.bin/aucat/aucat.c @@ -102,7 +102,7 @@ unsigned int dev_round; /* device block size */ int dev_rate; /* device sample rate (Hz) */ unsigned int dev_pchan, dev_rchan; /* play & rec channels count */ adata_t *dev_pbuf, *dev_rbuf; /* play & rec buffers */ -unsigned int dev_mmcpos; /* last MMC position */ +long long dev_pos; /* last MMC position in frames */ #define DEV_STOP 0 /* stopped */ #define DEV_START 1 /* started */ unsigned int dev_pstate; /* one of above */ @@ -350,10 +350,8 @@ slot_init(struct slot *s) } static void -slot_start(struct slot *s, unsigned int mmc) +slot_start(struct slot *s, long long pos) { - off_t mmcpos; - #ifdef DEBUG if (s->pstate != SLOT_INIT) { slot_log(s); @@ -361,8 +359,15 @@ slot_start(struct slot *s, unsigned int mmc) panic(); } #endif - mmcpos = ((off_t)mmc * s->afile.rate / MTC_SEC) * s->bpf; - if (!afile_seek(&s->afile, mmcpos)) { + /* + * convert pos to slot sample rate + * + * At this stage, we could adjust s->resamp.diff to get + * sub-frame accuracy. + */ + pos = pos * s->afile.rate / dev_rate; + + if (!afile_seek(&s->afile, pos * s->bpf)) { s->pstate = SLOT_INIT; return; } @@ -659,7 +664,7 @@ dev_open(char *dev, int mode, int bufsz, char *port) dev_rchan = par.rchan; dev_rbuf = xmalloc(sizeof(adata_t) * dev_rchan * dev_round); } - dev_mmcpos = 0; + dev_pos = 0; dev_pstate = DEV_STOP; if (log_level >= 2) { log_puts(dev_name); @@ -750,7 +755,7 @@ dev_mmcstart(void) if (dev_pstate == DEV_STOP) { dev_pstate = DEV_START; for (s = slot_list; s != NULL; s = s->next) - slot_start(s, dev_mmcpos); + slot_start(s, dev_pos); dev_prime = (dev_mode & SIO_PLAY) ? dev_bufsz / dev_round : 0; sio_start(dev_sh); if (log_level >= 2) @@ -792,18 +797,23 @@ dev_mmcstop(void) static void dev_mmcloc(unsigned int mmc) { - if (dev_mmcpos == mmc) + long long pos; + + pos = mmc * dev_rate / MTC_SEC; + if (dev_pos == pos) return; - dev_mmcpos = mmc; + dev_pos = pos; if (log_level >= 2) { log_puts("relocated to "); - log_putu((dev_mmcpos / (MTC_SEC * 3600)) % 24); + log_putu((mmc / (MTC_SEC * 3600)) % 24); log_puts(":"); - log_putu((dev_mmcpos / (MTC_SEC * 60)) % 60); + log_putu((mmc / (MTC_SEC * 60)) % 60); log_puts(":"); - log_putu((dev_mmcpos / (MTC_SEC)) % 60); + log_putu((mmc / (MTC_SEC)) % 60); + log_puts("."); + log_putu((mmc / (MTC_SEC / 100)) % 100); log_puts("."); - log_putu((dev_mmcpos / (MTC_SEC / 100)) % 100); + log_putu((mmc / (MTC_SEC / 100)) % 100); log_puts("\n"); } if (dev_pstate == DEV_START) { @@ -1007,7 +1017,7 @@ offline(void) dev_pchan = dev_rchan = cmax + 1; dev_pbuf = dev_rbuf = xmalloc(sizeof(adata_t) * dev_pchan * dev_round); dev_pstate = DEV_STOP; - dev_mmcpos = 0; + dev_pos = 0; for (s = slot_list; s != NULL; s = s->next) slot_init(s); for (s = slot_list; s != NULL; s = s->next) |