static int ww_init(void) { int play_dev_count, src_dev_count; int err; play_dev_count = waveOutGetNumDevs(); src_dev_count = waveInGetNumDevs(); info("winwave: output devices: %d, input devices: %d\n", play_dev_count, src_dev_count); err = ausrc_register(&ausrc, baresip_ausrcl(), "winwave", winwave_src_alloc); err |= auplay_register(&auplay, baresip_auplayl(), "winwave", winwave_play_alloc); return err; }
static int auloop_reset(struct audio_loop *al, uint32_t srate, uint32_t ch) { struct auplay_prm auplay_prm; struct ausrc_prm ausrc_prm; const struct config *cfg = conf_config(); int err; 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; /* audio player/source must be stopped first */ al->auplay = mem_deref(al->auplay); al->ausrc = mem_deref(al->ausrc); al->aubuf = mem_deref(al->aubuf); al->srate = srate; al->ch = ch; info("Audio-loop: %uHz, %dch, %s\n", al->srate, al->ch, aufmt_name(al->fmt)); err = aubuf_alloc(&al->aubuf, 320, 0); if (err) return err; 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); if (err) { warning("auloop: auplay %s,%s failed: %m\n", cfg->audio.play_mod, cfg->audio.play_dev, err); return err; } 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, read_handler, error_handler, al); if (err) { warning("auloop: ausrc %s,%s failed: %m\n", cfg->audio.src_mod, cfg->audio.src_dev, err); return err; } return err; }