From mboxrd@z Thu Jan 1 00:00:00 1970 From: Takashi Iwai Subject: Re: [PATCH 6/9] rate: handle negative values from snd_pcm_mmap_playback_hw_avail Date: Mon, 15 Sep 2014 10:49:07 +0200 Message-ID: References: <1410633021-20395-1-git-send-email-patrakov@gmail.com> <1410633021-20395-7-git-send-email-patrakov@gmail.com> Mime-Version: 1.0 (generated by SEMI 1.14.6 - "Maruoka") Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Received: from mx2.suse.de (cantor2.suse.de [195.135.220.15]) by alsa0.perex.cz (Postfix) with ESMTP id A6D6C266684 for ; Mon, 15 Sep 2014 10:49:07 +0200 (CEST) In-Reply-To: <1410633021-20395-7-git-send-email-patrakov@gmail.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: alsa-devel-bounces@alsa-project.org To: "Alexander E. Patrakov" Cc: alsa-devel@alsa-project.org, clemens@ladisch.de List-Id: alsa-devel@alsa-project.org At Sun, 14 Sep 2014 00:30:18 +0600, Alexander E. Patrakov wrote: > > Such negative returns are possible during an underrun if xrun detection > is disabled. > > So, don't store the result in an unsigned variable (where it will > overflow), and postpone the trigger in such case, too. > > Signed-off-by: Alexander E. Patrakov > --- > > The patch is only compile-tested and the second hunk may well be wrong. > > There are also similar issues in pcm_share.c, but, as I don't completely > understand the code there and cannot test that plugin at all due to > unrelated crashes, there will be no patch from me. In general, hw_avail must not be negative before starting the stream. If it is, then it means most likely the driver problem, so we should return error immediately instead. Takashi > > src/pcm/pcm_rate.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/src/pcm/pcm_rate.c b/src/pcm/pcm_rate.c > index b436a8e..736d558 100644 > --- a/src/pcm/pcm_rate.c > +++ b/src/pcm/pcm_rate.c > @@ -1058,7 +1058,7 @@ static snd_pcm_state_t snd_pcm_rate_state(snd_pcm_t *pcm) > static int snd_pcm_rate_start(snd_pcm_t *pcm) > { > snd_pcm_rate_t *rate = pcm->private_data; > - snd_pcm_uframes_t avail; > + snd_pcm_sframes_t avail; > > if (pcm->stream == SND_PCM_STREAM_CAPTURE) > return snd_pcm_start(rate->gen.slave); > @@ -1069,7 +1069,7 @@ static int snd_pcm_rate_start(snd_pcm_t *pcm) > gettimestamp(&rate->trigger_tstamp, pcm->tstamp_type); > > avail = snd_pcm_mmap_playback_hw_avail(rate->gen.slave); > - if (avail == 0) { > + if (avail <= 0) { > /* postpone the trigger since we have no data committed yet */ > rate->start_pending = 1; > return 0; > -- > 2.1.0 >