From patchwork Sat Sep 13 18:30:20 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alexander Patrakov X-Patchwork-Id: 4899961 X-Patchwork-Delegate: tiwai@suse.de Return-Path: X-Original-To: patchwork-alsa-devel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id A58A39F32B for ; Sat, 13 Sep 2014 18:30:48 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 43481201CD for ; Sat, 13 Sep 2014 18:34:54 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) by mail.kernel.org (Postfix) with ESMTP id DD6C4201C8 for ; Sat, 13 Sep 2014 18:34:52 +0000 (UTC) Received: by alsa0.perex.cz (Postfix, from userid 1000) id EEC872657FB; Sat, 13 Sep 2014 20:34:51 +0200 (CEST) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Spam-Level: X-Spam-Status: No, score=-1.8 required=5.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, NO_DNS_FOR_FROM, T_DKIM_INVALID, UNPARSEABLE_RELAY autolearn=no version=3.3.1 Received: from alsa0.perex.cz (localhost [IPv6:::1]) by alsa0.perex.cz (Postfix) with ESMTP id 60D362655E3; Sat, 13 Sep 2014 20:31:13 +0200 (CEST) X-Original-To: alsa-devel@alsa-project.org Delivered-To: alsa-devel@alsa-project.org Received: by alsa0.perex.cz (Postfix, from userid 1000) id 37142265531; Sat, 13 Sep 2014 20:31:09 +0200 (CEST) Received: from mail-la0-f53.google.com (mail-la0-f53.google.com [209.85.215.53]) by alsa0.perex.cz (Postfix) with ESMTP id 6BB922625CF for ; Sat, 13 Sep 2014 20:30:57 +0200 (CEST) Received: by mail-la0-f53.google.com with SMTP id ge10so2727989lab.12 for ; Sat, 13 Sep 2014 11:30:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=eVG5XgmctKtNlN3HNEv2oAoD3/g31c4s/nos1CU4PGw=; b=qIogsaaQuHuLqxQlGTkj4zVKSIURSO2+oDoqxh5d9E0XNoPdgMJlFgXQuIiZxlSq9Q oMFcUaXuIpWBgGK/GGLspCURds3K4zNu0SFVX5oh70sD7QRy+T+t2ewGswqZ5aL/Qk63 7ixlCA4tE4nX+b/nC5oTWoSeWak4nZyPbbC+0qoYhLSDHx3F+DtcEVQOdnr8LfHEFMg3 KzRDX2d2mZ0Ob9uUkgBUolRfeJlPBKJ5KjO9GZDKoRdqBKkD1LTDVHrlmuLh5CmmxanP pZqXoKwnfK2zEw4FuNMcSg1YaErlGfjkLnAnhsk1GOMzG+oTA/xbdVT3FC6spD3zLFSQ EeCg== X-Received: by 10.112.160.163 with SMTP id xl3mr16612801lbb.80.1410633057069; Sat, 13 Sep 2014 11:30:57 -0700 (PDT) Received: from localhost.localdomain (111279190.convex.ru. [82.193.153.141]) by mx.google.com with ESMTPSA id pc2sm2567718lbb.5.2014.09.13.11.30.56 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sat, 13 Sep 2014 11:30:56 -0700 (PDT) From: "Alexander E. Patrakov" To: alsa-devel@alsa-project.org Date: Sun, 14 Sep 2014 00:30:20 +0600 Message-Id: <1410633021-20395-9-git-send-email-patrakov@gmail.com> X-Mailer: git-send-email 2.1.0 In-Reply-To: <1410633021-20395-1-git-send-email-patrakov@gmail.com> References: <1410633021-20395-1-git-send-email-patrakov@gmail.com> Cc: tiwai@suse.de, clemens@ladisch.de, "Alexander E. Patrakov" Subject: [alsa-devel] [PATCH 8/9] pcm: rewindable, forwardable: don't return stale data X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "Alsa-devel mailing list for ALSA developers - http://www.alsa-project.org" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: alsa-devel-bounces@alsa-project.org Sender: alsa-devel-bounces@alsa-project.org X-Virus-Scanned: ClamAV using ClamSMTP The current behavior of snd_pcm_rewindable and snd_pcm_forwardable means that the returned value is only accurate to one period. Or maybe even meaningless if period interrupts are off. Fetch the up-to-date position of the hardware pointer, as that's what is wanted by callers. Signed-off-by: Alexander E. Patrakov --- src/pcm/pcm_dmix.c | 6 ++++++ src/pcm/pcm_dshare.c | 6 ++++++ src/pcm/pcm_dsnoop.c | 6 ++++++ src/pcm/pcm_hw.c | 6 ++++++ src/pcm/pcm_ioplug.c | 2 ++ src/pcm/pcm_plugin.c | 6 ++++++ 6 files changed, 32 insertions(+) diff --git a/src/pcm/pcm_dmix.c b/src/pcm/pcm_dmix.c index babde6a..d9565f9 100644 --- a/src/pcm/pcm_dmix.c +++ b/src/pcm/pcm_dmix.c @@ -661,6 +661,9 @@ static int snd_pcm_dmix_pause(snd_pcm_t *pcm ATTRIBUTE_UNUSED, int enable ATTRIB static snd_pcm_sframes_t snd_pcm_dmix_rewindable(snd_pcm_t *pcm) { + int err = snd_pcm_dmix_hwsync(pcm); + if (err < 0) + return err; return snd_pcm_mmap_playback_hw_rewindable(pcm); } @@ -744,6 +747,9 @@ static snd_pcm_sframes_t snd_pcm_dmix_rewind(snd_pcm_t *pcm, snd_pcm_uframes_t f static snd_pcm_sframes_t snd_pcm_dmix_forwardable(snd_pcm_t *pcm) { + int err = snd_pcm_dmix_hwsync(pcm); + if (err < 0) + return err; return snd_pcm_mmap_avail(pcm); } diff --git a/src/pcm/pcm_dshare.c b/src/pcm/pcm_dshare.c index 020e6f7..de0b242 100644 --- a/src/pcm/pcm_dshare.c +++ b/src/pcm/pcm_dshare.c @@ -412,6 +412,9 @@ static int snd_pcm_dshare_pause(snd_pcm_t *pcm ATTRIBUTE_UNUSED, int enable ATTR static snd_pcm_sframes_t snd_pcm_dshare_rewindable(snd_pcm_t *pcm) { + int err = snd_pcm_dshare_hwsync(pcm); + if (err < 0) + return err; return snd_pcm_mmap_playback_hw_rewindable(pcm); } @@ -428,6 +431,9 @@ static snd_pcm_sframes_t snd_pcm_dshare_rewind(snd_pcm_t *pcm, snd_pcm_uframes_t static snd_pcm_sframes_t snd_pcm_dshare_forwardable(snd_pcm_t *pcm) { + int err = snd_pcm_dshare_hwsync(pcm); + if (err < 0) + return err; return snd_pcm_mmap_playback_avail(pcm); } diff --git a/src/pcm/pcm_dsnoop.c b/src/pcm/pcm_dsnoop.c index 8333eef..00cd461 100644 --- a/src/pcm/pcm_dsnoop.c +++ b/src/pcm/pcm_dsnoop.c @@ -335,6 +335,9 @@ static int snd_pcm_dsnoop_pause(snd_pcm_t *pcm ATTRIBUTE_UNUSED, int enable ATTR static snd_pcm_sframes_t snd_pcm_dsnoop_rewindable(snd_pcm_t *pcm) { + int err = snd_pcm_dsnoop_hwsync(pcm); + if (err < 0) + return err; return snd_pcm_mmap_capture_hw_avail(pcm); } @@ -351,6 +354,9 @@ static snd_pcm_sframes_t snd_pcm_dsnoop_rewind(snd_pcm_t *pcm, snd_pcm_uframes_t static snd_pcm_sframes_t snd_pcm_dsnoop_forwardable(snd_pcm_t *pcm) { + int err = snd_pcm_dsnoop_hwsync(pcm); + if (err < 0) + return err; return snd_pcm_mmap_capture_avail(pcm); } diff --git a/src/pcm/pcm_hw.c b/src/pcm/pcm_hw.c index c34b766..4a52703 100644 --- a/src/pcm/pcm_hw.c +++ b/src/pcm/pcm_hw.c @@ -659,6 +659,9 @@ static int snd_pcm_hw_pause(snd_pcm_t *pcm, int enable) static snd_pcm_sframes_t snd_pcm_hw_rewindable(snd_pcm_t *pcm) { + int err = snd_pcm_hw_hwsync(pcm); + if (err < 0) + return err; return snd_pcm_mmap_hw_rewindable(pcm); } @@ -679,6 +682,9 @@ static snd_pcm_sframes_t snd_pcm_hw_rewind(snd_pcm_t *pcm, snd_pcm_uframes_t fra static snd_pcm_sframes_t snd_pcm_hw_forwardable(snd_pcm_t *pcm) { + int err = snd_pcm_hw_hwsync(pcm); + if (err < 0) + return err; return snd_pcm_mmap_avail(pcm); } diff --git a/src/pcm/pcm_ioplug.c b/src/pcm/pcm_ioplug.c index fe9347c..3861bc2 100644 --- a/src/pcm/pcm_ioplug.c +++ b/src/pcm/pcm_ioplug.c @@ -503,6 +503,7 @@ static int snd_pcm_ioplug_pause(snd_pcm_t *pcm, int enable) static snd_pcm_sframes_t snd_pcm_ioplug_rewindable(snd_pcm_t *pcm) { + snd_pcm_ioplug_hw_ptr_update(pcm); return snd_pcm_mmap_hw_rewindable(pcm); } @@ -514,6 +515,7 @@ static snd_pcm_sframes_t snd_pcm_ioplug_rewind(snd_pcm_t *pcm, snd_pcm_uframes_t static snd_pcm_sframes_t snd_pcm_ioplug_forwardable(snd_pcm_t *pcm) { + snd_pcm_ioplug_hw_ptr_update(pcm); return snd_pcm_mmap_avail(pcm); } diff --git a/src/pcm/pcm_plugin.c b/src/pcm/pcm_plugin.c index c19e2f1..57a1953 100644 --- a/src/pcm/pcm_plugin.c +++ b/src/pcm/pcm_plugin.c @@ -198,6 +198,9 @@ static int snd_pcm_plugin_reset(snd_pcm_t *pcm) static snd_pcm_sframes_t snd_pcm_plugin_rewindable(snd_pcm_t *pcm) { + int err = snd_pcm_generic_hwsync(pcm); + if (err < 0) + return err; return snd_pcm_mmap_hw_rewindable(pcm); } @@ -226,6 +229,9 @@ snd_pcm_sframes_t snd_pcm_plugin_rewind(snd_pcm_t *pcm, snd_pcm_uframes_t frames static snd_pcm_sframes_t snd_pcm_plugin_forwardable(snd_pcm_t *pcm) { + int err = snd_pcm_generic_hwsync(pcm); + if (err < 0) + return err; return snd_pcm_mmap_avail(pcm); }