From mboxrd@z Thu Jan 1 00:00:00 1970 From: Takashi Iwai Subject: Re: [PATCH - IOPLUG DRAIN 0/2] Date: Wed, 28 Mar 2018 18:09:00 +0200 Message-ID: References: <1521726537-7651-1-git-send-email-twischer@de.adit-jv.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 (mx2.suse.de [195.135.220.15]) by alsa0.perex.cz (Postfix) with ESMTP id 226D4266E07 for ; Wed, 28 Mar 2018 18:09:02 +0200 (CEST) In-Reply-To: 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: "Wischer, Timo (ADITG/ESB)" Cc: "alsa-devel@alsa-project.org" List-Id: alsa-devel@alsa-project.org On Wed, 28 Mar 2018 10:42:50 +0200, Wischer, Timo (ADITG/ESB) wrote: > > @@ -67,6 +73,12 @@ static void snd_pcm_ioplug_hw_ptr_update(snd_pcm_t *pcm) > delta = wrap_point + hw - io->last_hw; > } > snd_pcm_mmap_hw_forward(io->data->pcm, delta); > + /* stop the stream if all samples are drained */ > + if (io->data->state == SND_PCM_STATE_DRAINING) { > + avail = snd_pcm_mmap_avail(pcm); > + if (avail >= pcm->buffer_size) > + snd_pcm_ioplug_drop(pcm); > + } > io->last_hw = (snd_pcm_uframes_t)hw; > } else > io->data->state = SNDRV_PCM_STATE_XRUN; > In case of draining drop has to be called because draining is done OK, makes sense. > @@ -488,20 +500,66 @@ static int snd_pcm_ioplug_drop(snd_pcm_t *pcm) > return 0; > } > > +static int ioplug_drain_via_poll(snd_pcm_t *pcm) > +{ > + ioplug_priv_t *io = pcm->private_data; > + int err; > + > + /* in non-blocking mode, leave application to poll() by itself */ > + if (io->data->nonblock) > + return -EAGAIN; > In case of nonblock snd_pcm_ioplug_hw_ptr_update() will not be called by the user > Therefore the user will never detect that draining is done. > I fear snd_pcm_ioplug_hw_ptr_update() has also to be called in nonblock mode here. For the non-blocking mode, it's not supposed that drain() is called multiple times. Instead, it should do the loop of snd_pcm_wait(), and status check, as ioplug_drain_vai_poll() actually does. Yes, it's weird, but it's the standard way for non-blocking mode, even for the kernel drivers. So, the practical recommendation for draining is to temporarily switch to blocking mode before calling snd_pcm_drain(). > Will you create the patch and apply it to master or > is there anything which I have to do? I'll cook up the proper patch and submit to ML soon later. Then it'll be merged to git tree, and you can work on it. thanks, Takashi