summaryrefslogtreecommitdiff
path: root/modules/auloop/auloop.c
diff options
context:
space:
mode:
Diffstat (limited to 'modules/auloop/auloop.c')
-rw-r--r--modules/auloop/auloop.c33
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,