[Jack-Devel] [PATCH] Don't start pcm if its already RUNNING

PrevNext  Index
DateWed, 01 Jul 2015 19:45:31 +0200
From [hidden] at fake-box dot com <[hidden] at fake-box dot com
To[hidden] at lists dot jackaudio dot org
A few months ago we'd digged jackd code in #alsa IRC trying to find why itfails with "ALSA: could not start playback (File descriptor in bad state)"when run on top "type bluetooth" pcm. The reason was in a single line (both in jack1/drivers/alsa/alsa_driver.cand jack2/linux/alsa/alsa_driver.c):&nbsp; if ((err = snd_pcm_start (driver-&gt;playback_handle)) &lt; 0) {which always fails after snd_pcm_mmap_commit() filling the buffer,because pcm's already in RUNNING state and can't be started again:&gt; http://www.alsa-project.org/alsa-doc/alsa-lib/pcm.html&gt; For playback, if samples in ring buffer is equal or greater than&gt; the start threshold parameters and the stream is not running,&gt; the stream will be started automaticallyThe following small patch fixes it for both jack1 and jack2:--- alsa_driver.c+++ alsa_driver.c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;@@ -1055,7 +1055,8 @@ alsa_driver_start (alsa_driver_t *driver&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; driver-&gt;user_nperiods&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * driver-&gt;frames_per_cycle);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((err = snd_pcm_start (driver-&gt;playback_handle)) &lt; 0) {+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (snd_pcm_state(driver-&gt;playback_handle) != SND_PCM_STATE_RUNNING+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp; (err = snd_pcm_start (driver-&gt;playback_handle)) &lt; 0) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jack_error ("ALSA: could not start playback (%s)",&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; snd_strerror (err));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;
PrevNext  Index

1435772743.21199_0.ltw:2, <20150701174531.78595542120 at h2306620 dot stratoserver dot net>