<p></p>
<p>><br>
> > Calling snd_pcm_avail/delay causes a syscall to the kernel, which<br>
> > communicates with the audio hardware, and can therefore be expensive<br>
> > on some cards.<br>
><br>
> here is my benchmarking, I'm not super-confident in the results<br>
><br>
> similar to Alexander, I am seeing an assertion immediately:<br>
> pulseaudio[2071]: Assertion 'frames > 0' failed at modules/alsa/alsa-sink.c:651, function mmap_write(). Aborting.<br>
><br>
> not loading the suspend-on-idle module didn't help, instead I patched<br>
> -            if (!after_avail && frames == 0)<br>
> +            if (frames == 0)<br>
>                  break;<br>
> immediately before the assert(); not sure if this is correct<br>
><br>
> snd_pcm_mmap_begin() which is called by pa_alsa_safe_mmap_begin()<br>
> explicitly states that frames may be set to 0 if no buffer is full -- so I<br>
> think 0 should NOT lead to an assertion<br>
><br>
> I don't understand the meaning of after_avail; in<br>
> if (!after_avail && (int) sframes == -EAGAIN)<br>
> down a few lines, after_avail is always false!?<br>
><br>
> anyway, above patch might have fixed the issue and I was able to do some<br>
> measurements on a beagleboard (ARMv7, OMAP3, TPS65950 PMIC audio),<br>
> Linux kernel 3.7 and PA shortly before the srbchannel patches...<br></p>
<p>Even the driver use SNDRV_PCM_INFO_NO_PERIOD_WAKEUP which is necessary but no sufficient </p>
<p>For timer schedulling, the driver need to report dma residue <br>
 and it look like some omap cannot report DMA residue granularity</p>
<p>Can your hardware report dma residue granularity? </p>
<p><a href="https://git.kernel.org/cgit/linux/kernel/git/tiwai/sound.git/tree/sound/soc/omap/omap-pcm.c">https://git.kernel.org/cgit/linux/kernel/git/tiwai/sound.git/tree/sound/soc/omap/omap-pcm.c</a></p>
<p>static snd_pcm_uframes_t omap_pcm_pointer(struct snd_pcm_substream *substream)<br>
{<br>
        snd_pcm_uframes_t offset;</p>
<p>       if (pcm_omap1510())<br>
                offset = snd_dmaengine_pcm_pointer_no_residue(substream);<br>
        else<br>
                offset = snd_dmaengine_pcm_pointer(substream);</p>
<p>       return offset;<br>
}</p>
<p><a href="https://git.kernel.org/cgit/linux/kernel/git/tiwai/sound.git/commit/sound/soc/soc-generic-dmaengine-pcm.c?id=93b943edfc5e439f7b843535e0bb0f7d2371f67f">https://git.kernel.org/cgit/linux/kernel/git/tiwai/sound.git/commit/sound/soc/soc-generic-dmaengine-pcm.c?id=93b943edfc5e439f7b843535e0bb0f7d2371f67f</a></p>
<p><a href="https://git.kernel.org/cgit/linux/kernel/git/tiwai/sound.git/commit/sound/soc/soc-generic-dmaengine-pcm.c?id=478028e088d6a94666d8a776be2cd2291faf3bbd">https://git.kernel.org/cgit/linux/kernel/git/tiwai/sound.git/commit/sound/soc/soc-generic-dmaengine-pcm.c?id=478028e088d6a94666d8a776be2cd2291faf3bbd</a></p>