From nobody Sat Jul 12 06:07:12 2025 Delivered-To: importer2@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer2=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1678085651; cv=none; d=zohomail.com; s=zohoarc; b=R0UJdLtpC4PUuho4riAxHXbHHVKoegbqa8UEIKnd+FKuNvYuMJA03C35cWkLfmazxkwhoGLOzTgsEU1LtLEWhpTL7nN7qArmwhea5ydx/xY5CgaC41CDqNL6Q0a5tf3GxEVqyu9HKpW5xrjDCZq1t8Z0XbrByu6s3rEYR7PlRHY= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1678085651; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=tf6vk0J2A9SG+DdZ+7X7ukWjXXOcBJkt01MctJforQo=; b=cg8t6dx3G4WX4t0vcwj9M3tKEd5VekkCCOKEVdVe5VZPPlmkuIrz9DGeEvQ/CPYwlIqva0Q1I1363SgLvwFU2xP4QO6oEzbk7WmA+iqz1u6oWd7NVC193Ds3pKjJVrephHBhpgJU1aJZEvouDEqM0iTbLGjaXP3OEDmyG8piIR0= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer2=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1678085651812420.95128118045477; Sun, 5 Mar 2023 22:54:11 -0800 (PST) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1pZ4jI-0007jo-7w; Mon, 06 Mar 2023 01:53:52 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pZ4jG-0007Rm-3X for qemu-devel@nongnu.org; Mon, 06 Mar 2023 01:53:50 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.129.124]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1pZ4jE-0000iK-J8 for qemu-devel@nongnu.org; Mon, 06 Mar 2023 01:53:49 -0500 Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-527-VLTiCfzNMGq7t6AJwMF_uw-1; Mon, 06 Mar 2023 01:53:44 -0500 Received: from smtp.corp.redhat.com (int-mx09.intmail.prod.int.rdu2.redhat.com [10.11.54.9]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id EDB538588E3; Mon, 6 Mar 2023 06:53:43 +0000 (UTC) Received: from localhost (unknown [10.39.208.3]) by smtp.corp.redhat.com (Postfix) with ESMTP id C5AF9492C14; Mon, 6 Mar 2023 06:53:42 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1678085627; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=tf6vk0J2A9SG+DdZ+7X7ukWjXXOcBJkt01MctJforQo=; b=Mp1mI9Oi4SZRfYPyEztXXApxVLFgW0D2F0RL9uQHkqaPxpywAgNhUTkledGEpVTnO8hIZx vvuM48ok++ORRtbbEV9kA5pufixZwt3fMJqJD6kWTxJAOXIs7GGZ+H6N5HPqoZhPELWJEe EPZsHDPK+BLbtne/mshpnNf+2RVps9k= X-MC-Unique: VLTiCfzNMGq7t6AJwMF_uw-1 From: marcandre.lureau@redhat.com To: qemu-devel@nongnu.org Cc: Gerd Hoffmann , =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= , Christian Schoenebeck , =?UTF-8?q?Volker=20R=C3=BCmelin?= Subject: [PULL 22/27] audio: replace the resampling loop in audio_pcm_sw_read() Date: Mon, 6 Mar 2023 10:51:57 +0400 Message-Id: <20230306065202.2160066-23-marcandre.lureau@redhat.com> In-Reply-To: <20230306065202.2160066-1-marcandre.lureau@redhat.com> References: <20230306065202.2160066-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-Scanned-By: MIMEDefang 3.1 on 10.11.54.9 Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer2=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=170.10.129.124; envelope-from=marcandre.lureau@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer2=patchew.org@nongnu.org Sender: qemu-devel-bounces+importer2=patchew.org@nongnu.org X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1678085653454100003 From: Volker R=C3=BCmelin Replace the resampling loop in audio_pcm_sw_read() with the new function audio_pcm_sw_resample_in(). Unlike the old resample loop the new function will try to consume input frames even if the output buffer is full. This is necessary when downsampling to avoid reading less audio frames than calculated in advance. The loop was unrolled to avoid complicated loop control conditions in this case. Acked-by: Mark Cave-Ayland Acked-by: Marc-Andr=C3=A9 Lureau Signed-off-by: Volker R=C3=BCmelin Message-Id: <20230224190555.7409-10-vr_qemu@t-online.de> --- audio/audio.c | 59 ++++++++++++++++++++++++++++++--------------------- 1 file changed, 35 insertions(+), 24 deletions(-) diff --git a/audio/audio.c b/audio/audio.c index e18b5e98c5..9e9c03a42e 100644 --- a/audio/audio.c +++ b/audio/audio.c @@ -543,11 +543,43 @@ static size_t audio_pcm_hw_conv_in(HWVoiceIn *hw, voi= d *pcm_buf, size_t samples) /* * Soft voice (capture) */ +static void audio_pcm_sw_resample_in(SWVoiceIn *sw, + size_t frames_in_max, size_t frames_out_max, + size_t *total_in, size_t *total_out) +{ + HWVoiceIn *hw =3D sw->hw; + struct st_sample *src, *dst; + size_t live, rpos, frames_in, frames_out; + + live =3D hw->total_samples_captured - sw->total_hw_samples_acquired; + rpos =3D audio_ring_posb(hw->conv_buf.pos, live, hw->conv_buf.size); + + /* resample conv_buf from rpos to end of buffer */ + src =3D hw->conv_buf.buffer + rpos; + frames_in =3D MIN(frames_in_max, hw->conv_buf.size - rpos); + dst =3D sw->resample_buf.buffer; + frames_out =3D frames_out_max; + st_rate_flow(sw->rate, src, dst, &frames_in, &frames_out); + rpos +=3D frames_in; + *total_in =3D frames_in; + *total_out =3D frames_out; + + /* resample conv_buf from start of buffer if there are input frames le= ft */ + if (frames_in_max - frames_in && rpos =3D=3D hw->conv_buf.size) { + src =3D hw->conv_buf.buffer; + frames_in =3D frames_in_max - frames_in; + dst +=3D frames_out; + frames_out =3D frames_out_max - frames_out; + st_rate_flow(sw->rate, src, dst, &frames_in, &frames_out); + *total_in +=3D frames_in; + *total_out +=3D frames_out; + } +} + static size_t audio_pcm_sw_read(SWVoiceIn *sw, void *buf, size_t size) { HWVoiceIn *hw =3D sw->hw; - size_t samples, live, ret =3D 0, swlim, isamp, osamp, rpos, total =3D = 0; - struct st_sample *src, *dst =3D sw->resample_buf.buffer; + size_t samples, live, ret, swlim, total; =20 live =3D hw->total_samples_captured - sw->total_hw_samples_acquired; if (!live) { @@ -558,33 +590,12 @@ static size_t audio_pcm_sw_read(SWVoiceIn *sw, void *= buf, size_t size) return 0; } =20 - rpos =3D audio_ring_posb(hw->conv_buf.pos, live, hw->conv_buf.size); - samples =3D size / sw->info.bytes_per_frame; =20 swlim =3D (live * sw->ratio) >> 32; swlim =3D MIN (swlim, samples); =20 - while (swlim) { - src =3D hw->conv_buf.buffer + rpos; - if (hw->conv_buf.pos > rpos) { - isamp =3D hw->conv_buf.pos - rpos; - } else { - isamp =3D hw->conv_buf.size - rpos; - } - - if (!isamp) { - break; - } - osamp =3D swlim; - - st_rate_flow (sw->rate, src, dst, &isamp, &osamp); - swlim -=3D osamp; - rpos =3D (rpos + isamp) % hw->conv_buf.size; - dst +=3D osamp; - ret +=3D osamp; - total +=3D isamp; - } + audio_pcm_sw_resample_in(sw, live, swlim, &total, &ret); =20 if (!hw->pcm_ops->volume_in) { mixeng_volume(sw->resample_buf.buffer, ret, &sw->vol); --=20 2.39.2