Commit 5b1f79f7 authored by Charles Keepax's avatar Charles Keepax Committed by Takashi Iwai

ALSA: compress_core: Calculate avail correctly for capture streams

Signed-off-by: default avatarCharles Keepax <ckeepax@opensource.wolfsonmicro.com>
Signed-off-by: default avatarRichard Fitzgerald <rf@opensource.wolfsonmicro.com>
Acked-by: default avatarVinod Koul <vinod.koul@intel.com>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 4c28e32d
...@@ -153,7 +153,10 @@ static int snd_compr_update_tstamp(struct snd_compr_stream *stream, ...@@ -153,7 +153,10 @@ static int snd_compr_update_tstamp(struct snd_compr_stream *stream,
pr_debug("dsp consumed till %d total %d bytes\n", pr_debug("dsp consumed till %d total %d bytes\n",
tstamp->byte_offset, tstamp->copied_total); tstamp->byte_offset, tstamp->copied_total);
stream->runtime->hw_pointer = tstamp->byte_offset; stream->runtime->hw_pointer = tstamp->byte_offset;
stream->runtime->total_bytes_transferred = tstamp->copied_total; if (stream->direction == SND_COMPRESS_PLAYBACK)
stream->runtime->total_bytes_transferred = tstamp->copied_total;
else
stream->runtime->total_bytes_available = tstamp->copied_total;
return 0; return 0;
} }
...@@ -164,12 +167,9 @@ static size_t snd_compr_calc_avail(struct snd_compr_stream *stream, ...@@ -164,12 +167,9 @@ static size_t snd_compr_calc_avail(struct snd_compr_stream *stream,
snd_compr_update_tstamp(stream, &avail->tstamp); snd_compr_update_tstamp(stream, &avail->tstamp);
/* Still need to return avail even if tstamp can't be filled in */ /* Still need to return avail even if tstamp can't be filled in */
/* FIXME: This needs to be different for capture stream,
available is # of compressed data, for playback it's
remainder of buffer */
if (stream->runtime->total_bytes_available == 0 && if (stream->runtime->total_bytes_available == 0 &&
stream->runtime->state == SNDRV_PCM_STATE_SETUP) { stream->runtime->state == SNDRV_PCM_STATE_SETUP &&
stream->direction == SND_COMPRESS_PLAYBACK) {
pr_debug("detected init and someone forgot to do a write\n"); pr_debug("detected init and someone forgot to do a write\n");
return stream->runtime->buffer_size; return stream->runtime->buffer_size;
} }
...@@ -178,13 +178,20 @@ static size_t snd_compr_calc_avail(struct snd_compr_stream *stream, ...@@ -178,13 +178,20 @@ static size_t snd_compr_calc_avail(struct snd_compr_stream *stream,
stream->runtime->total_bytes_transferred); stream->runtime->total_bytes_transferred);
if (stream->runtime->total_bytes_available == if (stream->runtime->total_bytes_available ==
stream->runtime->total_bytes_transferred) { stream->runtime->total_bytes_transferred) {
pr_debug("both pointers are same, returning full avail\n"); if (stream->direction == SND_COMPRESS_PLAYBACK) {
return stream->runtime->buffer_size; pr_debug("both pointers are same, returning full avail\n");
return stream->runtime->buffer_size;
} else {
pr_debug("both pointers are same, returning no avail\n");
return 0;
}
} }
avail->avail = stream->runtime->buffer_size - avail->avail = stream->runtime->total_bytes_available -
(stream->runtime->total_bytes_available - stream->runtime->total_bytes_transferred;
stream->runtime->total_bytes_transferred); if (stream->direction == SND_COMPRESS_PLAYBACK)
avail->avail = stream->runtime->buffer_size - avail->avail;
pr_debug("ret avail as %lld\n", avail->avail); pr_debug("ret avail as %lld\n", avail->avail);
return avail->avail; return avail->avail;
} }
......
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