diff options
author | Clemens Ladisch <clemens@ladisch.de> | 2006-10-23 10:26:57 -0400 |
---|---|---|
committer | Jaroslav Kysela <perex@server.perex.cz> | 2006-12-20 02:55:43 -0500 |
commit | 9a826ddba6e087b1be24dd78cd0eac42f7eb7e97 (patch) | |
tree | 95740bc34b8face55eb7c989e550986e4136259d | |
parent | 3bc89529594767b0f894589f6c05b2d9821b6791 (diff) |
[ALSA] pcm core: fix silence_start calculations
The case where silence_size < boundary was broken because different
parts of the snd_pcm_playback_silence() function disagreed about whether
silence_start should point to the start or to the end of the buffer part
to be silenced.
This patch changes the code to always use to the start, which also
simplifies several calculations.
Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
Signed-off-by: Jaroslav Kysela <perex@suse.cz>
-rw-r--r-- | sound/core/pcm_lib.c | 8 |
1 files changed, 3 insertions, 5 deletions
diff --git a/sound/core/pcm_lib.c b/sound/core/pcm_lib.c index 0bb142a28539..b336797be4fc 100644 --- a/sound/core/pcm_lib.c +++ b/sound/core/pcm_lib.c | |||
@@ -79,19 +79,17 @@ void snd_pcm_playback_silence(struct snd_pcm_substream *substream, snd_pcm_ufram | |||
79 | runtime->silence_filled -= frames; | 79 | runtime->silence_filled -= frames; |
80 | if ((snd_pcm_sframes_t)runtime->silence_filled < 0) { | 80 | if ((snd_pcm_sframes_t)runtime->silence_filled < 0) { |
81 | runtime->silence_filled = 0; | 81 | runtime->silence_filled = 0; |
82 | runtime->silence_start = (ofs + frames) - runtime->buffer_size; | 82 | runtime->silence_start = new_hw_ptr; |
83 | } else { | 83 | } else { |
84 | runtime->silence_start = ofs - runtime->silence_filled; | 84 | runtime->silence_start = ofs; |
85 | } | 85 | } |
86 | if ((snd_pcm_sframes_t)runtime->silence_start < 0) | ||
87 | runtime->silence_start += runtime->boundary; | ||
88 | } | 86 | } |
89 | frames = runtime->buffer_size - runtime->silence_filled; | 87 | frames = runtime->buffer_size - runtime->silence_filled; |
90 | } | 88 | } |
91 | snd_assert(frames <= runtime->buffer_size, return); | 89 | snd_assert(frames <= runtime->buffer_size, return); |
92 | if (frames == 0) | 90 | if (frames == 0) |
93 | return; | 91 | return; |
94 | ofs = (runtime->silence_start + runtime->silence_filled) % runtime->buffer_size; | 92 | ofs = runtime->silence_start % runtime->buffer_size; |
95 | while (frames > 0) { | 93 | while (frames > 0) { |
96 | transfer = ofs + frames > runtime->buffer_size ? runtime->buffer_size - ofs : frames; | 94 | transfer = ofs + frames > runtime->buffer_size ? runtime->buffer_size - ofs : frames; |
97 | if (runtime->access == SNDRV_PCM_ACCESS_RW_INTERLEAVED || | 95 | if (runtime->access == SNDRV_PCM_ACCESS_RW_INTERLEAVED || |