summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sound/soc/fsl/fsl_easrc_m2m.c17
1 files changed, 8 insertions, 9 deletions
diff --git a/sound/soc/fsl/fsl_easrc_m2m.c b/sound/soc/fsl/fsl_easrc_m2m.c
index 7f068d8ad362..82d06afbecb7 100644
--- a/sound/soc/fsl/fsl_easrc_m2m.c
+++ b/sound/soc/fsl/fsl_easrc_m2m.c
@@ -10,6 +10,7 @@ struct fsl_easrc_m2m {
unsigned int easrc_active;
unsigned int first_convert;
unsigned int sg_nodes[2];
+ unsigned int in_filled_len;
struct scatterlist sg[2][9];
struct dma_async_tx_descriptor *desc[2];
spinlock_t lock; /* protect mem resource */
@@ -181,17 +182,15 @@ static long fsl_easrc_calc_outbuf_len(struct fsl_easrc_m2m *m2m,
in_width = snd_pcm_format_physical_width(ctx->in_params.sample_format) / 8;
out_width = snd_pcm_format_physical_width(ctx->out_params.sample_format) / 8;
- in_samples = pbuf->input_buffer_length / (in_width * channels);
- out_samples = ctx->out_params.sample_rate * in_samples /
- ctx->in_params.sample_rate;
- out_length = out_samples * out_width * channels;
-
- if (out_samples <= ctx->out_missed_sample) {
+ m2m->in_filled_len += pbuf->input_buffer_length;
+ if (m2m->in_filled_len <= ctx->in_filled_sample * in_width * channels) {
out_length = 0;
- ctx->out_missed_sample -= out_samples;
} else {
- out_length -= ctx->out_missed_sample * out_width * channels;
- ctx->out_missed_sample = 0;
+ in_samples = m2m->in_filled_len / (in_width * channels) - ctx->in_filled_sample;
+ out_samples = ctx->out_params.sample_rate * in_samples /
+ ctx->in_params.sample_rate;
+ out_length = out_samples * out_width * channels;
+ m2m->in_filled_len = ctx->in_filled_sample * in_width * channels;
}
return out_length;