diff --git a/aucat/aucat.c b/aucat/aucat.c index 9abcfab..04695a3 100644 --- a/aucat/aucat.c +++ b/aucat/aucat.c @@ -466,10 +466,10 @@ play_filt_dec(struct slot *s, void *in, void *out, int todo) dec_do(&s->conv, in, tmp, todo); break; case ENC_ULAW: - dec_do_ulaw(&s->conv, in, tmp, todo); + dec_do_ulaw(&s->conv, in, tmp, todo, 0); break; case ENC_ALAW: - dec_do_alaw(&s->conv, in, tmp, todo); + dec_do_ulaw(&s->conv, in, tmp, todo, 1); break; case ENC_FLOAT: dec_do_float(&s->conv, in, tmp, todo); diff --git a/aucat/dsp.c b/aucat/dsp.c index 573d7e0..c0bef34 100644 --- a/aucat/dsp.c +++ b/aucat/dsp.c @@ -660,14 +660,15 @@ dec_do_float(struct conv *p, unsigned char *in, unsigned char *out, int todo) } /* - * convert samples from ulaw to adata_t + * convert samples from ulaw/alaw to adata_t */ void -dec_do_ulaw(struct conv *p, unsigned char *in, unsigned char *out, int todo) +dec_do_ulaw(struct conv *p, unsigned char *in, unsigned char *out, int todo, int is_alaw) { unsigned int f; unsigned char *idata; adata_t *odata; + short *map; #ifdef DEBUG if (log_level >= 4) { @@ -676,33 +677,11 @@ dec_do_ulaw(struct conv *p, unsigned char *in, unsigned char *out, int todo) log_puts(" frames\n"); } #endif + map = is_alaw ? wav_alawmap : wav_ulawmap; idata = in; odata = (adata_t *)out; for (f = todo * p->nch; f > 0; f--) - *odata++ = wav_ulawmap[*idata++] << (ADATA_BITS - 16); -} - -/* - * convert samples from alaw to adata_t - */ -void -dec_do_alaw(struct conv *p, unsigned char *in, unsigned char *out, int todo) -{ - unsigned int f; - unsigned char *idata; - adata_t *odata; - -#ifdef DEBUG - if (log_level >= 4) { - log_puts("dec_alaw: copying "); - log_putu(todo); - log_puts(" frames\n"); - } -#endif - idata = in; - odata = (adata_t *)out; - for (f = todo * p->nch; f > 0; f--) - *odata++ = wav_alawmap[*idata++] << (ADATA_BITS - 16); + *odata++ = map[*idata++] << (ADATA_BITS - 16); } /* diff --git a/aucat/dsp.h b/aucat/dsp.h index ab70e7f..f790466 100644 --- a/aucat/dsp.h +++ b/aucat/dsp.h @@ -154,8 +154,7 @@ void enc_sil_do(struct conv *, unsigned char *, int); void enc_init(struct conv *, struct aparams *, int); void dec_do(struct conv *, unsigned char *, unsigned char *, int); void dec_do_float(struct conv *, unsigned char *, unsigned char *, int); -void dec_do_alaw(struct conv *, unsigned char *, unsigned char *, int); -void dec_do_ulaw(struct conv *, unsigned char *, unsigned char *, int); +void dec_do_ulaw(struct conv *, unsigned char *, unsigned char *, int, int); void dec_init(struct conv *, struct aparams *, int); void cmap_add(struct cmap *, void *, void *, int, int); void cmap_copy(struct cmap *, void *, void *, int, int);