Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/1726723/?format=api
{ "id": 1726723, "url": "http://patchwork.ozlabs.org/api/patches/1726723/?format=api", "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20230115131224.30751-15-volker.ruemelin@t-online.de/", "project": { "id": 14, "url": "http://patchwork.ozlabs.org/api/projects/14/?format=api", "name": "QEMU Development", "link_name": "qemu-devel", "list_id": "qemu-devel.nongnu.org", "list_email": "qemu-devel@nongnu.org", "web_url": "", "scm_url": "", "webscm_url": "", "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<20230115131224.30751-15-volker.ruemelin@t-online.de>", "list_archive_url": null, "date": "2023-01-15T13:12:22", "name": "[15/17] audio: handle leftover audio frame from upsampling", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "785135188341e6ae6d5f087daefd1c0c59e2f53f", "submitter": { "id": 83211, "url": "http://patchwork.ozlabs.org/api/people/83211/?format=api", "name": "Volker Rümelin", "email": "volker.ruemelin@t-online.de" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20230115131224.30751-15-volker.ruemelin@t-online.de/mbox/", "series": [ { "id": 336714, "url": "http://patchwork.ozlabs.org/api/series/336714/?format=api", "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/list/?series=336714", "date": "2023-01-15T13:08:29", "name": "[01/17] audio: change type of mix_buf and conv_buf", "version": 1, "mbox": "http://patchwork.ozlabs.org/series/336714/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/1726723/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/1726723/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>", "X-Original-To": "incoming@patchwork.ozlabs.org", "Delivered-To": "patchwork-incoming@legolas.ozlabs.org", "Authentication-Results": "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org\n (client-ip=209.51.188.17; helo=lists.gnu.org;\n envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n receiver=<UNKNOWN>)", "Received": [ "from lists.gnu.org (lists.gnu.org [209.51.188.17])\n\t(using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4NvwcF1hw9z23g1\n\tfor <incoming@patchwork.ozlabs.org>; Mon, 16 Jan 2023 00:14:53 +1100 (AEDT)", "from localhost ([::1] helo=lists1p.gnu.org)\n\tby lists.gnu.org with esmtp (Exim 4.90_1)\n\t(envelope-from <qemu-devel-bounces@nongnu.org>)\n\tid 1pH2ot-0004aL-K9; Sun, 15 Jan 2023 08:13:07 -0500", "from eggs.gnu.org ([2001:470:142:3::10])\n by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <volker.ruemelin@t-online.de>)\n id 1pH2or-0004Se-IU\n for qemu-devel@nongnu.org; Sun, 15 Jan 2023 08:13:05 -0500", "from mailout02.t-online.de ([194.25.134.17])\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <volker.ruemelin@t-online.de>)\n id 1pH2op-0005Dj-GY\n for qemu-devel@nongnu.org; Sun, 15 Jan 2023 08:13:05 -0500", "from fwd72.dcpf.telekom.de (fwd72.aul.t-online.de [10.223.144.98])\n by mailout02.t-online.de (Postfix) with SMTP id 45FF11AA32;\n Sun, 15 Jan 2023 14:13:02 +0100 (CET)", "from linpower.localnet ([79.208.25.151]) by fwd72.t-online.de\n with (TLSv1.3:TLS_AES_256_GCM_SHA384 encrypted)\n esmtp id 1pH2oi-3CNxcv0; Sun, 15 Jan 2023 14:12:57 +0100", "by linpower.localnet (Postfix, from userid 1000)\n id 76B102006C7; Sun, 15 Jan 2023 14:12:24 +0100 (CET)" ], "From": "=?utf-8?q?Volker_R=C3=BCmelin?= <volker.ruemelin@t-online.de>", "To": "Gerd Hoffmann <kraxel@redhat.com>", "Cc": "qemu-devel@nongnu.org", "Subject": "[PATCH 15/17] audio: handle leftover audio frame from upsampling", "Date": "Sun, 15 Jan 2023 14:12:22 +0100", "Message-Id": "<20230115131224.30751-15-volker.ruemelin@t-online.de>", "X-Mailer": "git-send-email 2.35.3", "In-Reply-To": "<61bd351f-0683-7f58-b746-66c9578a7cdc@t-online.de>", "References": "<61bd351f-0683-7f58-b746-66c9578a7cdc@t-online.de>", "MIME-Version": "1.0", "Content-Type": "text/plain; charset=UTF-8", "Content-Transfer-Encoding": "8bit", "X-TOI-MSGID": "8c006ce9-0454-4073-a2e2-8799cdae2b28", "Received-SPF": "none client-ip=194.25.134.17;\n envelope-from=volker.ruemelin@t-online.de; helo=mailout02.t-online.de", "X-Spam_score_int": "-25", "X-Spam_score": "-2.6", "X-Spam_bar": "--", "X-Spam_report": "(-2.6 / 5.0 requ) BAYES_00=-1.9, FREEMAIL_FROM=0.001,\n RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H3=-0.01, RCVD_IN_MSPIKE_WL=-0.01,\n SPF_HELO_NONE=0.001, SPF_NONE=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": "<qemu-devel.nongnu.org>", "List-Unsubscribe": "<https://lists.nongnu.org/mailman/options/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>", "List-Archive": "<https://lists.nongnu.org/archive/html/qemu-devel>", "List-Post": "<mailto:qemu-devel@nongnu.org>", "List-Help": "<mailto:qemu-devel-request@nongnu.org?subject=help>", "List-Subscribe": "<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=subscribe>", "Errors-To": "qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org", "Sender": "qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org" }, "content": "From: Volker Rümelin <vr_qemu@t-online.de>\n\nUpsampling may leave one remaining audio frame in the input\nbuffer. The emulated audio playback devices are currently\nresposible to write this audio frame again in the next write\ncycle. Push that task down to audio_pcm_sw_write.\n\nThis is another step towards an audio callback interface that\nguarantees that when audio frontends are told they can write\nn audio frames, they can actually do so.\n\nSigned-off-by: Volker Rümelin <vr_qemu@t-online.de>\n---\n audio/audio.c | 34 ++++++++++++++++++++++++++++------\n audio/audio_template.h | 5 +++--\n 2 files changed, 31 insertions(+), 8 deletions(-)", "diff": "diff --git a/audio/audio.c b/audio/audio.c\nindex ecd5d31260..b846b89a27 100644\n--- a/audio/audio.c\n+++ b/audio/audio.c\n@@ -729,16 +729,21 @@ static size_t audio_pcm_sw_write(SWVoiceOut *sw, void *buf, size_t buf_len)\n hw_free = hw_free > live ? hw_free - live : 0;\n frames_out_max = MIN(dead, hw_free);\n sw_max = st_rate_frames_in(sw->rate, frames_out_max);\n- fe_max = MIN(buf_len / sw->info.bytes_per_frame, sw->resample_buf.size);\n+ fe_max = MIN(buf_len / sw->info.bytes_per_frame + sw->resample_buf.pos,\n+ sw->resample_buf.size);\n frames_in_max = MIN(sw_max, fe_max);\n \n if (!frames_in_max) {\n return 0;\n }\n \n- sw->conv(sw->resample_buf.buffer, buf, frames_in_max);\n- if (!sw->hw->pcm_ops->volume_out) {\n- mixeng_volume(sw->resample_buf.buffer, frames_in_max, &sw->vol);\n+ if (frames_in_max > sw->resample_buf.pos) {\n+ sw->conv(sw->resample_buf.buffer + sw->resample_buf.pos,\n+ buf, frames_in_max - sw->resample_buf.pos);\n+ if (!sw->hw->pcm_ops->volume_out) {\n+ mixeng_volume(sw->resample_buf.buffer + sw->resample_buf.pos,\n+ frames_in_max - sw->resample_buf.pos, &sw->vol);\n+ }\n }\n \n audio_pcm_sw_resample_out(sw, frames_in_max, frames_out_max,\n@@ -747,6 +752,22 @@ static size_t audio_pcm_sw_write(SWVoiceOut *sw, void *buf, size_t buf_len)\n sw->total_hw_samples_mixed += total_out;\n sw->empty = sw->total_hw_samples_mixed == 0;\n \n+ /*\n+ * Upsampling may leave one audio frame in the resample buffer. Decrement\n+ * total_in by one if there was a leftover frame from the previous resample\n+ * pass in the resample buffer. Increment total_in by one if the current\n+ * resample pass left one frame in the resample buffer.\n+ */\n+ if (frames_in_max - total_in == 1) {\n+ /* copy one leftover audio frame to the beginning of the buffer */\n+ *sw->resample_buf.buffer = *(sw->resample_buf.buffer + total_in);\n+ total_in += 1 - sw->resample_buf.pos;\n+ sw->resample_buf.pos = 1;\n+ } else if (total_in >= sw->resample_buf.pos) {\n+ total_in -= sw->resample_buf.pos;\n+ sw->resample_buf.pos = 0;\n+ }\n+\n #ifdef DEBUG_OUT\n dolog (\n \"%s: write size %zu written %zu total mixed %zu\\n\",\n@@ -1153,8 +1174,9 @@ static void audio_run_out (AudioState *s)\n } else {\n free = 0;\n }\n- if (free > 0) {\n- free = MIN(free, sw->resample_buf.size);\n+ if (free > sw->resample_buf.pos) {\n+ free = MIN(free, sw->resample_buf.size)\n+ - sw->resample_buf.pos;\n sw->callback.fn(sw->callback.opaque,\n free * sw->info.bytes_per_frame);\n }\ndiff --git a/audio/audio_template.h b/audio/audio_template.h\nindex 07c14e7821..a9a550a3b7 100644\n--- a/audio/audio_template.h\n+++ b/audio/audio_template.h\n@@ -132,8 +132,9 @@ static int glue (audio_pcm_sw_alloc_resources_, TYPE) (SW *sw)\n return -1;\n }\n \n- sw->resample_buf.buffer = g_new0(st_sample, samples);\n- sw->resample_buf.size = samples;\n+ /* allocate one additional audio frame that is needed for upsampling */\n+ sw->resample_buf.buffer = g_new0(st_sample, samples + 1);\n+ sw->resample_buf.size = samples + 1;\n sw->resample_buf.pos = 0;\n \n #ifdef DAC\n", "prefixes": [ "15/17" ] }