summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--usr.bin/aucat/aucat.c40
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)