Audio: Volume: Add state clear to reset() operation

This patch adds clear of all component data in reset() component
operation except state variables those are set by control
commands.

Note: If a new stream starts after reset() without free() and
new(), the clear of all component data would result to wrong
gain and wrong mute state. The driver commands are not re-sent
in such case.

Signed-off-by: Seppo Ingalsuo <seppo.ingalsuo@linux.intel.com>
This commit is contained in:
Seppo Ingalsuo 2021-07-22 18:07:54 +03:00 committed by Liam Girdwood
parent 93ea223a89
commit e82392e246
1 changed files with 24 additions and 4 deletions

View File

@ -292,6 +292,26 @@ static void volume_ramp(struct comp_dev *dev)
vol_sync_host(dev, cd->channels);
}
/**
* \brief Reset state except controls.
*/
static void reset_state(struct vol_data *cd)
{
int i;
for (i = 0; i < PLATFORM_MAX_CHANNELS; i++) {
cd->rvolume[i] = 0;
cd->ramp_coef[i] = 0;
}
cd->channels = 0;
cd->ramp_finished = false;
cd->vol_ramp_active = false;
cd->vol_ramp_frames = 0;
cd->vol_ramp_elapsed_frames = 0;
cd->sample_rate = 0;
}
/**
* \brief Creates volume component.
*
@ -365,9 +385,7 @@ static struct comp_dev *volume_new(const struct comp_driver *drv,
cd->muted[i] = false;
}
cd->vol_ramp_active = false;
cd->channels = 0; /* To be set in prepare() */
reset_state(cd);
comp_info(dev, "vol->initial_ramp = %d, vol->ramp = %d, vol->min_value = %d, vol->max_value = %d",
vol->initial_ramp, vol->ramp,
vol->min_value, vol->max_value);
@ -890,8 +908,10 @@ err:
*/
static int volume_reset(struct comp_dev *dev)
{
comp_dbg(dev, "volume_reset()");
struct vol_data *cd = comp_get_drvdata(dev);
comp_dbg(dev, "volume_reset()");
reset_state(cd);
comp_set_state(dev, COMP_TRIGGER_RESET);
return 0;
}