diff options
Diffstat (limited to 'modules/auloop/auloop.c')
-rw-r--r-- | modules/auloop/auloop.c | 33 |
1 files changed, 26 insertions, 7 deletions
diff --git a/modules/auloop/auloop.c b/modules/auloop/auloop.c index 22dd1b0..5573621 100644 --- a/modules/auloop/auloop.c +++ b/modules/auloop/auloop.c @@ -44,6 +44,7 @@ struct audio_loop { struct tmr tmr; uint32_t srate; uint32_t ch; + enum aufmt fmt; uint32_t n_read; uint32_t n_write; @@ -90,9 +91,9 @@ static void print_stats(struct audio_loop *al) if (al->n_write) rw_ratio = 1.0 * al->n_read / al->n_write; - (void)re_fprintf(stderr, "\r%uHz %dch " + (void)re_fprintf(stderr, "\r%uHz %dch %s " " n_read=%u n_write=%u rw_ratio=%.2f", - al->srate, al->ch, + al->srate, al->ch, aufmt_name(al->fmt), al->n_read, al->n_write, rw_ratio); if (str_isset(aucodec)) @@ -136,23 +137,25 @@ static int codec_read(struct audio_loop *al, int16_t *sampv, size_t sampc) } -static void read_handler(const int16_t *sampv, size_t sampc, void *arg) +static void read_handler(const void *sampv, size_t sampc, void *arg) { struct audio_loop *al = arg; + size_t num_bytes = sampc * aufmt_sample_size(al->fmt); int err; ++al->n_read; - err = aubuf_write_samp(al->ab, sampv, sampc); + err = aubuf_write(al->ab, sampv, num_bytes); if (err) { warning("auloop: aubuf_write: %m\n", err); } } -static void write_handler(int16_t *sampv, size_t sampc, void *arg) +static void write_handler(void *sampv, size_t sampc, void *arg) { struct audio_loop *al = arg; + size_t num_bytes = sampc * aufmt_sample_size(al->fmt); int err; ++al->n_write; @@ -166,7 +169,7 @@ static void write_handler(int16_t *sampv, size_t sampc, void *arg) } } else { - aubuf_read_samp(al->ab, sampv, sampc); + aubuf_read(al->ab, sampv, num_bytes); } } @@ -218,9 +221,23 @@ static int auloop_reset(struct audio_loop *al) if (!cfg) return ENOENT; + if (cfg->audio.src_fmt != cfg->audio.play_fmt) { + warning("auloop: ausrc_format and auplay_format" + " must be the same\n"); + return EINVAL; + } + + al->fmt = cfg->audio.src_fmt; + /* Optional audio codec */ - if (str_isset(aucodec)) + if (str_isset(aucodec)) { + if (cfg->audio.src_fmt != AUFMT_S16LE) { + warning("auloop: only s16 supported with codec\n"); + return EINVAL; + } + start_codec(al, aucodec); + } /* audio player/source must be stopped first */ al->auplay = mem_deref(al->auplay); @@ -248,6 +265,7 @@ static int auloop_reset(struct audio_loop *al) auplay_prm.srate = al->srate; auplay_prm.ch = al->ch; auplay_prm.ptime = PTIME; + auplay_prm.fmt = al->fmt; err = auplay_alloc(&al->auplay, baresip_auplayl(), cfg->audio.play_mod, &auplay_prm, cfg->audio.play_dev, write_handler, al); @@ -261,6 +279,7 @@ static int auloop_reset(struct audio_loop *al) ausrc_prm.srate = al->srate; ausrc_prm.ch = al->ch; ausrc_prm.ptime = PTIME; + ausrc_prm.fmt = al->fmt; err = ausrc_alloc(&al->ausrc, baresip_ausrcl(), NULL, cfg->audio.src_mod, &ausrc_prm, cfg->audio.src_dev, |