To store MMC position, use samples (at device rate) as time units

instead of 2400-ths of second. No behaviour change.
This commit is contained in:
Alexandre Ratchov 2016-05-31 10:37:17 +02:00
parent e606351421
commit 0798868306
1 changed files with 25 additions and 15 deletions

View File

@ -103,7 +103,7 @@ unsigned int dev_round; /* device block size */
int dev_rate; /* device sample rate (Hz) */ int dev_rate; /* device sample rate (Hz) */
unsigned int dev_pchan, dev_rchan; /* play & rec channels count */ unsigned int dev_pchan, dev_rchan; /* play & rec channels count */
adata_t *dev_pbuf, *dev_rbuf; /* play & rec buffers */ 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_STOP 0 /* stopped */
#define DEV_START 1 /* started */ #define DEV_START 1 /* started */
unsigned int dev_pstate; /* one of above */ unsigned int dev_pstate; /* one of above */
@ -351,10 +351,8 @@ slot_init(struct slot *s)
} }
static void static void
slot_start(struct slot *s, unsigned int mmc) slot_start(struct slot *s, long long pos)
{ {
off_t mmcpos;
#ifdef DEBUG #ifdef DEBUG
if (s->pstate != SLOT_INIT) { if (s->pstate != SLOT_INIT) {
slot_log(s); slot_log(s);
@ -362,8 +360,15 @@ slot_start(struct slot *s, unsigned int mmc)
panic(); panic();
} }
#endif #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; s->pstate = SLOT_INIT;
return; return;
} }
@ -662,7 +667,7 @@ dev_open(char *dev, int mode, int bufsz, char *port)
dev_rchan = par.rchan; dev_rchan = par.rchan;
dev_rbuf = xmalloc(sizeof(adata_t) * dev_rchan * dev_round); dev_rbuf = xmalloc(sizeof(adata_t) * dev_rchan * dev_round);
} }
dev_mmcpos = 0; dev_pos = 0;
dev_pstate = DEV_STOP; dev_pstate = DEV_STOP;
if (log_level >= 2) { if (log_level >= 2) {
log_puts(dev_name); log_puts(dev_name);
@ -753,7 +758,7 @@ dev_mmcstart(void)
if (dev_pstate == DEV_STOP) { if (dev_pstate == DEV_STOP) {
dev_pstate = DEV_START; dev_pstate = DEV_START;
for (s = slot_list; s != NULL; s = s->next) 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; dev_prime = (dev_mode & SIO_PLAY) ? dev_bufsz / dev_round : 0;
sio_start(dev_sh); sio_start(dev_sh);
if (log_level >= 2) if (log_level >= 2)
@ -795,18 +800,23 @@ dev_mmcstop(void)
static void static void
dev_mmcloc(unsigned int mmc) dev_mmcloc(unsigned int mmc)
{ {
if (dev_mmcpos == mmc) long long pos;
pos = mmc * dev_rate / MTC_SEC;
if (dev_pos == pos)
return; return;
dev_mmcpos = mmc; dev_pos = pos;
if (log_level >= 2) { if (log_level >= 2) {
log_puts("relocated to "); log_puts("relocated to ");
log_putu((dev_mmcpos / (MTC_SEC * 3600)) % 24); log_putu((mmc / (MTC_SEC * 3600)) % 24);
log_puts(":"); log_puts(":");
log_putu((dev_mmcpos / (MTC_SEC * 60)) % 60); log_putu((mmc / (MTC_SEC * 60)) % 60);
log_puts(":"); log_puts(":");
log_putu((dev_mmcpos / (MTC_SEC)) % 60); log_putu((mmc / (MTC_SEC)) % 60);
log_puts("."); log_puts(".");
log_putu((dev_mmcpos / (MTC_SEC / 100)) % 100); log_putu((mmc / (MTC_SEC / 100)) % 100);
log_puts(".");
log_putu((mmc / (MTC_SEC / 100)) % 100);
log_puts("\n"); log_puts("\n");
} }
if (dev_pstate == DEV_START) { if (dev_pstate == DEV_START) {
@ -1010,7 +1020,7 @@ offline(void)
dev_pchan = dev_rchan = cmax + 1; dev_pchan = dev_rchan = cmax + 1;
dev_pbuf = dev_rbuf = xmalloc(sizeof(adata_t) * dev_pchan * dev_round); dev_pbuf = dev_rbuf = xmalloc(sizeof(adata_t) * dev_pchan * dev_round);
dev_pstate = DEV_STOP; dev_pstate = DEV_STOP;
dev_mmcpos = 0; dev_pos = 0;
for (s = slot_list; s != NULL; s = s->next) for (s = slot_list; s != NULL; s = s->next)
slot_init(s); slot_init(s);
for (s = slot_list; s != NULL; s = s->next) for (s = slot_list; s != NULL; s = s->next)