Commit 6ffa6f39 authored by Oswald Buddenhagen's avatar Oswald Buddenhagen Committed by Takashi Iwai

ALSA: pcm: simplify top-up mode init in snd_pcm_playback_silence()

Inline the remaining call of snd_pcm_playback_hw_avail(). This makes
the top-up branch more congruent with the thresholded one, and allows
simplifying the handling of the corner cases.
Signed-off-by: default avatarOswald Buddenhagen <oswald.buddenhagen@gmx.de>
Link: https://lore.kernel.org/r/20230505155244.2312199-6-oswald.buddenhagen@gmx.deSigned-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 6d8d56db
...@@ -90,15 +90,32 @@ void snd_pcm_playback_silence(struct snd_pcm_substream *substream, snd_pcm_ufram ...@@ -90,15 +90,32 @@ void snd_pcm_playback_silence(struct snd_pcm_substream *substream, snd_pcm_ufram
* This filling mode aims at free-running mode (used for example by dmix), * This filling mode aims at free-running mode (used for example by dmix),
* which doesn't update the application pointer. * which doesn't update the application pointer.
*/ */
if (new_hw_ptr == ULONG_MAX) { /* initialization */ snd_pcm_uframes_t hw_ptr = runtime->status->hw_ptr;
snd_pcm_sframes_t avail = snd_pcm_playback_hw_avail(runtime); if (new_hw_ptr == ULONG_MAX) {
if (avail > runtime->buffer_size) /*
avail = runtime->buffer_size; * Initialization, fill the whole unused buffer with silence.
runtime->silence_filled = avail > 0 ? avail : 0; *
runtime->silence_start = runtime->status->hw_ptr; * Usually, this is entered while stopped, before data is queued,
* so both pointers are expected to be zero.
*/
snd_pcm_sframes_t avail = runtime->control->appl_ptr - hw_ptr;
if (avail < 0)
avail += runtime->boundary;
/*
* In free-running mode, appl_ptr will be zero even while running,
* so we end up with a huge number. There is no useful way to
* handle this, so we just clear the whole buffer.
*/
runtime->silence_filled = avail > runtime->buffer_size ? 0 : avail;
runtime->silence_start = hw_ptr;
} else { } else {
update_silence_vars(runtime, runtime->status->hw_ptr, new_hw_ptr); /* Silence the just played area immediately */
update_silence_vars(runtime, hw_ptr, new_hw_ptr);
} }
/*
* In this mode, silence_filled actually includes the valid
* sample data from the user.
*/
frames = runtime->buffer_size - runtime->silence_filled; frames = runtime->buffer_size - runtime->silence_filled;
} }
if (snd_BUG_ON(frames > runtime->buffer_size)) if (snd_BUG_ON(frames > runtime->buffer_size))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment