diff options
author | Oswald Buddenhagen <oswald.buddenhagen@gmx.de> | 2023-04-20 13:33:23 +0200 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2023-04-21 12:21:04 +0200 |
commit | 9f656705c5faa18afb26d922cfc64f9fd103c38d (patch) | |
tree | e3ded34bd862102da4bab1f1329e9a3f31e186a3 /include/sound/pcm.h | |
parent | 0d19bd4df75eee7df20377ffa2b62a4adedd19ff (diff) | |
download | linux-9f656705c5faa18afb26d922cfc64f9fd103c38d.tar.gz linux-9f656705c5faa18afb26d922cfc64f9fd103c38d.tar.bz2 linux-9f656705c5faa18afb26d922cfc64f9fd103c38d.zip |
ALSA: pcm: rewrite snd_pcm_playback_silence()
The auto-silencer supports two modes: "thresholded" to fill up "just
enough", and "top-up" to fill up "as much as possible". The two modes
used rather distinct code paths, which this patch unifies. The only
remaining distinction is how much we actually want to fill.
This fixes a bug in thresholded mode, where we failed to use new_hw_ptr,
resulting in under-fill.
Top-up mode is now more well-behaved and much easier to understand in
corner cases.
This also updates comments in the proximity of silencing-related data
structures.
Signed-off-by: Oswald Buddenhagen <oswald.buddenhagen@gmx.de>
Reviewed-by: Jaroslav Kysela <perex@perex.cz>
Link: https://lore.kernel.org/r/20230420113324.877164-1-oswald.buddenhagen@gmx.de
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'include/sound/pcm.h')
-rw-r--r-- | include/sound/pcm.h | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/include/sound/pcm.h b/include/sound/pcm.h index 27040b472a4f..19f564606ac4 100644 --- a/include/sound/pcm.h +++ b/include/sound/pcm.h @@ -378,18 +378,18 @@ struct snd_pcm_runtime { unsigned int rate_den; unsigned int no_period_wakeup: 1; - /* -- SW params -- */ - int tstamp_mode; /* mmap timestamp is updated */ + /* -- SW params; see struct snd_pcm_sw_params for comments -- */ + int tstamp_mode; unsigned int period_step; snd_pcm_uframes_t start_threshold; snd_pcm_uframes_t stop_threshold; - snd_pcm_uframes_t silence_threshold; /* Silence filling happens when - noise is nearest than this */ - snd_pcm_uframes_t silence_size; /* Silence filling size */ - snd_pcm_uframes_t boundary; /* pointers wrap point */ + snd_pcm_uframes_t silence_threshold; + snd_pcm_uframes_t silence_size; + snd_pcm_uframes_t boundary; + /* internal data of auto-silencer */ snd_pcm_uframes_t silence_start; /* starting pointer to silence area */ - snd_pcm_uframes_t silence_filled; /* size filled with silence */ + snd_pcm_uframes_t silence_filled; /* already filled part of silence area */ union snd_pcm_sync_id sync; /* hardware synchronization ID */ |