diff options
-rw-r--r-- | sound/soc/fsl/fsl_easrc_m2m.c | 17 |
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; |