Placing a constraint on buffer size is not enough, programs are still free to use periods that are smaller than FIFO, which causes transmit underflows as soon as the stream starts if program operates in period-sized writes, ending up in endless loop of underruns.
Signed-off-by: Grazvydas Ignotas notasas@gmail.com --- sound/soc/omap/omap-mcbsp.c | 18 +++++++++--------- 1 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/sound/soc/omap/omap-mcbsp.c b/sound/soc/omap/omap-mcbsp.c index 207365c..b9d1272 100644 --- a/sound/soc/omap/omap-mcbsp.c +++ b/sound/soc/omap/omap-mcbsp.c @@ -93,11 +93,11 @@ static void omap_mcbsp_set_threshold(struct snd_pcm_substream *substream) omap_mcbsp_set_rx_threshold(mcbsp, words); }
-static int omap_mcbsp_hwrule_min_buffersize(struct snd_pcm_hw_params *params, - struct snd_pcm_hw_rule *rule) +static int omap_mcbsp_hwrule_min_period_size(struct snd_pcm_hw_params *params, + struct snd_pcm_hw_rule *rule) { - struct snd_interval *buffer_size = hw_param_interval(params, - SNDRV_PCM_HW_PARAM_BUFFER_SIZE); + struct snd_interval *period_size = hw_param_interval(params, + SNDRV_PCM_HW_PARAM_PERIOD_SIZE); struct snd_interval *channels = hw_param_interval(params, SNDRV_PCM_HW_PARAM_CHANNELS); struct omap_mcbsp *mcbsp = rule->private; @@ -109,7 +109,7 @@ static int omap_mcbsp_hwrule_min_buffersize(struct snd_pcm_hw_params *params,
frames.min = size / channels->min; frames.integer = 1; - return snd_interval_refine(buffer_size, &frames); + return snd_interval_refine(period_size, &frames); }
static int omap_mcbsp_dai_startup(struct snd_pcm_substream *substream, @@ -138,12 +138,12 @@ static int omap_mcbsp_dai_startup(struct snd_pcm_substream *substream, */ if (mcbsp->pdata->buffer_size) { /* - * Rule for the buffer size. We should not allow - * smaller buffer than the FIFO size to avoid underruns + * Rule for the period size. We should not allow + * smaller period than the FIFO size to avoid underruns */ snd_pcm_hw_rule_add(substream->runtime, 0, - SNDRV_PCM_HW_PARAM_BUFFER_SIZE, - omap_mcbsp_hwrule_min_buffersize, + SNDRV_PCM_HW_PARAM_PERIOD_SIZE, + omap_mcbsp_hwrule_min_period_size, mcbsp, SNDRV_PCM_HW_PARAM_CHANNELS, -1);