Received: by 2002:a25:683:0:0:0:0:0 with SMTP id 125csp405217ybg; Wed, 10 Jun 2020 04:02:10 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyMimzUx92pDCSZhep+bzwTzjgNkRl+3FSi4PxxbxggppLKYY/wggcLK2jHrIvHt25qoj+z X-Received: by 2002:a17:906:1dc9:: with SMTP id v9mr2923445ejh.252.1591786930378; Wed, 10 Jun 2020 04:02:10 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1591786930; cv=none; d=google.com; s=arc-20160816; b=M6ApGD7rG3JVCJwbF1ht4bJEJDYMt5Ew3DcnNtlSGhKIpRM2WGuBZcRdVCL1eau8xv cscTBAC5I3f8fBoPw/1cFAi+CHcSVaiX3ogXip8hAHRfDh34JHIgOwGYFYk2yUsRr+LS 3l7argGdSWwtFiVq7gyiAIAgOgylg6RUbJRJJdkQc6JNJZaulE4pCjWDnGGjheEkMEH6 yIGvi3rQEajjWWo5n7aP7oh2kJjEYT+6RmEZTocLu+PZdmTa+1bWF4aWJTWAm0OJarWO CfB6xvWvEbzQnzkvLi+vmrt7SCf2nxI98zRXwLJKlRO1iogwBUU/5iZIlYyI5fbjfE5A EE4Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding :content-language:in-reply-to:mime-version:user-agent:date :message-id:from:references:cc:to:subject:dkim-signature; bh=Gaoy82nx63ddYrD03WQdgMSQz0m1g7Mo1K4KeYxZPTk=; b=aVclP1lb4muqq/o0oYOrbF4cA6VRlNbGJTLvP+aZSC07kbX899SUxklpF7+EF7qRFr Wle+StjEuz3uwERm1ImEdR5wm9qPyIhQhCMbSxznc1TrbOtingd0tZ/e6x5evOk0KSIG KSHbIakqpUBHVO5ES6lAjMT7+49BJqIsJLccDOizwJaGPwo8cigOBupdSTjOuIJuBbwl ZksE++anFoohH4QKVx5YdsFFRdozBVBvCwY1o1twnUzLhzxCSCb5G9i8IFLULQ2gDteY CQRAfJJQ5ArEbat5eN8HlI2QqL82m+fnF7JD8zLCalQc9mC0MDESfRppzne+p5fVwMP0 pa/g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=rW5B41js; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id jz21si12130613ejb.635.2020.06.10.04.01.46; Wed, 10 Jun 2020 04:02:10 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=rW5B41js; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728374AbgFJK5B (ORCPT + 99 others); Wed, 10 Jun 2020 06:57:01 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58864 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728330AbgFJK5B (ORCPT ); Wed, 10 Jun 2020 06:57:01 -0400 Received: from mail-wr1-x443.google.com (mail-wr1-x443.google.com [IPv6:2a00:1450:4864:20::443]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id CBABCC03E96B for ; Wed, 10 Jun 2020 03:57:00 -0700 (PDT) Received: by mail-wr1-x443.google.com with SMTP id x6so1708335wrm.13 for ; Wed, 10 Jun 2020 03:57:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=subject:to:cc:references:from:message-id:date:user-agent :mime-version:in-reply-to:content-language:content-transfer-encoding; bh=Gaoy82nx63ddYrD03WQdgMSQz0m1g7Mo1K4KeYxZPTk=; b=rW5B41jsRaHDL4Q3LVL6RPpznlkcuO9V/zbKOO5L/lfYeO86WLBOxNKT3/qYBJgPcZ XRZxbI8MOiCIMjV9LphZJCQMNxqZFrlKgBxhZissCgOQ6/wbmRwbEAfe+n1t6crxYn/F veHME6FuvAnjJ563h9YvBAJoWxWTPSUV0w4LdsLAY+uV9h9CiWsCLZOydAX9ctORnjDf FRP3Gj0gKrjTzV4I99uWAkZEcFm+t1dy6YX2Ky5nzL6QlK7JIEzCWOedl830AYNbbTYg K4VMnQHO8LiMy7RY/6Y28MhZ+ocOzEdPhTbvZ6M5MtiPPUesNMNhEjjw/R77vlGgSa6W XR8w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:cc:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=Gaoy82nx63ddYrD03WQdgMSQz0m1g7Mo1K4KeYxZPTk=; b=FzasT4hwDdh4wGQu4yesdySEx8NswJ1im7TiAJH7tafzRJtQV4SF7zl6xTUHgSFASm wemMvCqKhJ9m0C7XbjoIAQn1Ev4ozX61wZEo8B3yFnPuWbhwXGCIXUwwuv+/RjBYf99y BG15CwrcWm1Jgok0dPWsoahi9EWFE84aPjjunnAkhHxKUWsR5nWkOQLAP385H97AoMMW QZscVqe5ch33qBBMsgr5eJ0ccTHdf67yQE6Rk6L08+YsTx4jpnq4lrG7PRSvmgwKB4Qr HkRXoqY1AD4J2/dw+mRfALr/Ws2IHL0QR6jgXyYv0F7RUiProVwjCeNrYBVry1n/gUaM KoOg== X-Gm-Message-State: AOAM53131JsF+H+k0bmDMta8Rvo38Yw6KVYTLbRChSFKZ1R+n73tLL6D pEf968DHH7nO66St+paLjSeKbg== X-Received: by 2002:a5d:4a04:: with SMTP id m4mr3293394wrq.153.1591786619510; Wed, 10 Jun 2020 03:56:59 -0700 (PDT) Received: from [192.168.86.34] (cpc89974-aztw32-2-0-cust43.18-1.cable.virginm.net. [86.30.250.44]) by smtp.googlemail.com with ESMTPSA id b19sm6988807wmj.0.2020.06.10.03.56.58 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 10 Jun 2020 03:56:58 -0700 (PDT) Subject: Re: [RFC PATCH] ALSA: compress: Fix gapless playback state machine To: Jaroslav Kysela , vkoul@kernel.org Cc: tiwai@suse.com, alsa-devel@alsa-project.org, linux-kernel@vger.kernel.org, broonie@kernel.org References: <20200610100729.362-1-srinivas.kandagatla@linaro.org> <817d009e-fa09-e897-cfc3-997bf1dd5e30@perex.cz> From: Srinivas Kandagatla Message-ID: <683a67bc-44e8-1e2b-b9a4-29e71ce86fdc@linaro.org> Date: Wed, 10 Jun 2020 11:56:58 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.8.0 MIME-Version: 1.0 In-Reply-To: <817d009e-fa09-e897-cfc3-997bf1dd5e30@perex.cz> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 10/06/2020 11:40, Jaroslav Kysela wrote: > Dne 10. 06. 20 v 12:07 Srinivas Kandagatla napsal(a): >> For gapless playback call to snd_compr_drain_notify() after >> partial drain should put the state to SNDRV_PCM_STATE_RUNNING >> rather than SNDRV_PCM_STATE_SETUP as the driver is ready to >> process the buffers for new track. >> >> With existing code, if we are playing 3 tracks in gapless, after >> partial drain finished on previous track 1 the state is set to >> SNDRV_PCM_STATE_SETUP which is then moved to SNDRV_PCM_STATE_PREPARED >> after data write. With this state calls to snd_compr_next_track() and >> few other calls will fail as they expect the state to be in >> SNDRV_PCM_STATE_RUNNING. >> >> Here is the sequence of events and state transitions: >> >> 1. set_params (Track 1), state =  SNDRV_PCM_STATE_SETUP >> 2. set_metadata (Track 1), no state change, state = SNDRV_PCM_STATE_SETUP >> 3. fill and trigger start (Track 1), state = SNDRV_PCM_STATE_RUNNING >> 4. set_next_track (Track 2), state = SNDRV_PCM_STATE_RUNNING >> 5. partial_drain (Track 1), state = SNDRV_PCM_STATE_SETUP >> 6  snd_compr_drain_notify (Track 1), state = SNDRV_PCM_STATE_SETUP >> 7. fill data (Track 2), state = SNDRV_PCM_STATE_PREPARED >> 8. set_metadata (Track 3), no state change, state = >> SNDRV_PCM_STATE_PREPARED >> 9. set_next_track (Track 3), !! FAILURE as state != >> SNDRV_PCM_STATE_RUNNING > > > The snd_compr_drain_notify() is called only from snd_compr_stop(). > Something is missing in this sequence? snd_compr_drain_notify() can also be called by drivers to notify when partial drain is finished. In this case its called from qcom compress driver. --srini > >                     Jaroslav > > > >> >> Fixes: f44f2a5417b2 ("ALSA: compress: fix drain calls blocking other >> compress functions (v6)") >> Signed-off-by: Srinivas Kandagatla >> --- >> >> I wonder who did gapless work on upstream so far? >> >>   include/sound/compress_driver.h | 2 +- >>   1 file changed, 1 insertion(+), 1 deletion(-) >> >> diff --git a/include/sound/compress_driver.h >> b/include/sound/compress_driver.h >> index 6ce8effa0b12..eabac33864c2 100644 >> --- a/include/sound/compress_driver.h >> +++ b/include/sound/compress_driver.h >> @@ -182,7 +182,7 @@ static inline void snd_compr_drain_notify(struct >> snd_compr_stream *stream) >>       if (snd_BUG_ON(!stream)) >>           return; >> -    stream->runtime->state = SNDRV_PCM_STATE_SETUP; >> +    stream->runtime->state = SNDRV_PCM_STATE_RUNNING; >>       wake_up(&stream->runtime->sleep); >>   } >> > >