From 5c84940c1f587782de2212fe3977bcc0dba0c8d0 Mon Sep 17 00:00:00 2001 From: Abramo Bagnara Date: Mon, 22 Jan 2001 09:27:50 +0000 Subject: [PATCH] Fixed useless insertion of copy plugin. Fixed sw_params for pcm_plug --- src/pcm/pcm_plug.c | 36 +++++++++++++----------------------- src/pcm/pcm_rate.c | 24 +++++++----------------- 2 files changed, 20 insertions(+), 40 deletions(-) diff --git a/src/pcm/pcm_plug.c b/src/pcm/pcm_plug.c index cd2b8237..67f6b097 100644 --- a/src/pcm/pcm_plug.c +++ b/src/pcm/pcm_plug.c @@ -564,15 +564,22 @@ static int snd_pcm_plug_hw_params(snd_pcm_t *pcm, snd_pcm_hw_params_t *params) clt_params.channels = snd_pcm_hw_param_value(params, SND_PCM_HW_PARAM_CHANNELS, 0); clt_params.rate = snd_pcm_hw_param_value(params, SND_PCM_HW_PARAM_RATE, 0); - slv_params.access = snd_pcm_hw_param_first(slave, &sparams, SND_PCM_HW_PARAM_ACCESS, 0); slv_params.format = snd_pcm_hw_param_value(&sparams, SND_PCM_HW_PARAM_FORMAT, 0); slv_params.channels = snd_pcm_hw_param_value(&sparams, SND_PCM_HW_PARAM_CHANNELS, 0); slv_params.rate = snd_pcm_hw_param_value(&sparams, SND_PCM_HW_PARAM_RATE, 0); snd_pcm_plug_clear(pcm); - err = snd_pcm_plug_insert_plugins(pcm, &clt_params, &slv_params); - if (err < 0) - return err; - err = snd_pcm_hw_params(plug->slave, params); + if (!(clt_params.format == slv_params.format && + clt_params.channels == slv_params.channels && + clt_params.rate == slv_params.rate && + snd_pcm_hw_param_test(&sparams, SND_PCM_HW_PARAM_ACCESS, + clt_params.access))) { + slv_params.access = snd_pcm_hw_param_first(slave, &sparams, SND_PCM_HW_PARAM_ACCESS, 0); + err = snd_pcm_plug_insert_plugins(pcm, &clt_params, &slv_params); + if (err < 0) + return err; + } + slave = plug->slave; + err = snd_pcm_hw_params(slave, params); if (err < 0) { snd_pcm_plug_clear(pcm); return err; @@ -594,24 +601,7 @@ static int snd_pcm_plug_hw_free(snd_pcm_t *pcm) static int snd_pcm_plug_sw_params(snd_pcm_t *pcm, snd_pcm_sw_params_t * params) { snd_pcm_plug_t *plug = pcm->private; - snd_pcm_t *slave = plug->req_slave; - snd_pcm_uframes_t avail_min, xfer_align, silence_threshold, silence_size; - int err; - avail_min = params->avail_min; - xfer_align = params->xfer_align; - silence_threshold = params->silence_threshold; - silence_size = params->silence_size; - params->avail_min = muldiv_near(params->avail_min, slave->rate, pcm->rate); - params->xfer_align = muldiv_near(params->xfer_align, slave->rate, pcm->rate); - params->silence_threshold = muldiv_near(params->silence_threshold, slave->rate, pcm->rate); - params->silence_size = muldiv_near(params->silence_size, slave->rate, pcm->rate); - err = snd_pcm_sw_params(slave, params); - params->avail_min = avail_min; - params->xfer_align = xfer_align; - params->silence_threshold = silence_threshold; - params->silence_size = silence_size; - params->boundary = LONG_MAX - pcm->buffer_size * 2 - LONG_MAX % pcm->buffer_size; - return err; + return snd_pcm_sw_params(plug->slave, params); } static int snd_pcm_plug_channel_info(snd_pcm_t *pcm, snd_pcm_channel_info_t *info) diff --git a/src/pcm/pcm_rate.c b/src/pcm/pcm_rate.c index 786c49cb..909f8b98 100644 --- a/src/pcm/pcm_rate.c +++ b/src/pcm/pcm_rate.c @@ -396,23 +396,13 @@ static int snd_pcm_rate_sw_params(snd_pcm_t *pcm, snd_pcm_sw_params_t * params) { snd_pcm_rate_t *rate = pcm->private; snd_pcm_t *slave = rate->plug.slave; - snd_pcm_uframes_t avail_min, xfer_align, silence_threshold, silence_size; - int err; - avail_min = params->avail_min; - xfer_align = params->xfer_align; - silence_threshold = params->silence_threshold; - silence_size = params->silence_size; - params->avail_min = muldiv_near(params->avail_min, slave->rate, pcm->rate); - params->xfer_align = muldiv_near(params->xfer_align, slave->rate, pcm->rate); - params->silence_threshold = muldiv_near(params->silence_threshold, slave->rate, pcm->rate); - params->silence_size = muldiv_near(params->silence_size, slave->rate, pcm->rate); - err = snd_pcm_sw_params(slave, params); - params->avail_min = avail_min; - params->xfer_align = xfer_align; - params->silence_threshold = silence_threshold; - params->silence_size = silence_size; - params->boundary = LONG_MAX - pcm->buffer_size * 2 - LONG_MAX % pcm->buffer_size; - return err; + snd_pcm_sw_params_t sparams; + sparams = *params; + sparams.avail_min = muldiv_near(sparams.avail_min, slave->rate, pcm->rate); + sparams.xfer_align = muldiv_near(sparams.xfer_align, slave->rate, pcm->rate); + sparams.silence_threshold = muldiv_near(sparams.silence_threshold, slave->rate, pcm->rate); + sparams.silence_size = muldiv_near(sparams.silence_size, slave->rate, pcm->rate); + return snd_pcm_sw_params(slave, &sparams); } static int snd_pcm_rate_init(snd_pcm_t *pcm) -- 2.47.1