get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/1726719/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 1726719,
    "url": "http://patchwork.ozlabs.org/api/patches/1726719/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20230115131224.30751-11-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-11-volker.ruemelin@t-online.de>",
    "list_archive_url": null,
    "date": "2023-01-15T13:12:18",
    "name": "[11/17] audio: replace the resampling loop in audio_pcm_sw_read()",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "047cfbf7517381584924141bb0a9ac40dcd15f71",
    "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-11-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/1726719/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/1726719/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 4NvwbY13lGz23g1\n\tfor <incoming@patchwork.ozlabs.org>; Mon, 16 Jan 2023 00:14:17 +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 1pH2of-00049G-Jq; Sun, 15 Jan 2023 08:12:53 -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 1pH2od-00045u-Pw\n for qemu-devel@nongnu.org; Sun, 15 Jan 2023 08:12:51 -0500",
            "from mailout01.t-online.de ([194.25.134.80])\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 1pH2oc-0005BX-4W\n for qemu-devel@nongnu.org; Sun, 15 Jan 2023 08:12:51 -0500",
            "from fwd77.dcpf.telekom.de (fwd77.aul.t-online.de [10.223.144.103])\n by mailout01.t-online.de (Postfix) with SMTP id 85F8A16B21;\n Sun, 15 Jan 2023 14:12:48 +0100 (CET)",
            "from linpower.localnet ([79.208.25.151]) by fwd77.t-online.de\n with (TLSv1.3:TLS_AES_256_GCM_SHA384 encrypted)\n esmtp id 1pH2oZ-1TIEi10; Sun, 15 Jan 2023 14:12:47 +0100",
            "by linpower.localnet (Postfix, from userid 1000)\n id 6C3BC2006C1; 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 11/17] audio: replace the resampling loop in\n audio_pcm_sw_read()",
        "Date": "Sun, 15 Jan 2023 14:12:18 +0100",
        "Message-Id": "<20230115131224.30751-11-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": "6e23ab49-bdc3-4820-acf2-2d1c3cca5264",
        "Received-SPF": "none client-ip=194.25.134.80;\n envelope-from=volker.ruemelin@t-online.de; helo=mailout01.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_H2=-0.001, SPF_HELO_NONE=0.001,\n 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\nReplace the resampling loop in audio_pcm_sw_read() with the new\nfunction audio_pcm_sw_resample_in(). Unlike the old resample\nloop the new function will try to consume input frames even if\nthe output buffer is full. This is necessary when downsampling\nto avoid reading less audio frames than calculated in advance.\nThe loop was unrolled to avoid complicated loop control conditions\nin this case.\n\nSigned-off-by: Volker Rümelin <vr_qemu@t-online.de>\n---\n audio/audio.c | 59 ++++++++++++++++++++++++++++++---------------------\n 1 file changed, 35 insertions(+), 24 deletions(-)",
    "diff": "diff --git a/audio/audio.c b/audio/audio.c\nindex 3d3b5e5b91..83bac97fa4 100644\n--- a/audio/audio.c\n+++ b/audio/audio.c\n@@ -541,11 +541,43 @@ static size_t audio_pcm_hw_conv_in(HWVoiceIn *hw, void *pcm_buf, size_t samples)\n /*\n  * Soft voice (capture)\n  */\n+static void audio_pcm_sw_resample_in(SWVoiceIn *sw,\n+    size_t frames_in_max, size_t frames_out_max,\n+    size_t *total_in, size_t *total_out)\n+{\n+    HWVoiceIn *hw = sw->hw;\n+    struct st_sample *src, *dst;\n+    size_t live, rpos, frames_in, frames_out;\n+\n+    live = hw->total_samples_captured - sw->total_hw_samples_acquired;\n+    rpos = audio_ring_posb(hw->conv_buf.pos, live, hw->conv_buf.size);\n+\n+    /* resample conv_buf from rpos to end of buffer */\n+    src = hw->conv_buf.buffer + rpos;\n+    frames_in = MIN(live, hw->conv_buf.size - rpos);\n+    dst = sw->resample_buf.buffer;\n+    frames_out = frames_out_max;\n+    st_rate_flow(sw->rate, src, dst, &frames_in, &frames_out);\n+    rpos += frames_in;\n+    *total_in = frames_in;\n+    *total_out = frames_out;\n+\n+    /* resample conv_buf from start of buffer if there are input frames left */\n+    if (live - frames_in && rpos == hw->conv_buf.size) {\n+        src = hw->conv_buf.buffer;\n+        frames_in = live - frames_in;\n+        dst += frames_out;\n+        frames_out = frames_out_max - frames_out;\n+        st_rate_flow(sw->rate, src, dst, &frames_in, &frames_out);\n+        *total_in += frames_in;\n+        *total_out += frames_out;\n+    }\n+}\n+\n static size_t audio_pcm_sw_read(SWVoiceIn *sw, void *buf, size_t size)\n {\n     HWVoiceIn *hw = sw->hw;\n-    size_t samples, live, ret = 0, swlim, isamp, osamp, rpos, total = 0;\n-    struct st_sample *src, *dst = sw->resample_buf.buffer;\n+    size_t samples, live, ret, swlim, total;\n \n     live = hw->total_samples_captured - sw->total_hw_samples_acquired;\n     if (!live) {\n@@ -556,33 +588,12 @@ static size_t audio_pcm_sw_read(SWVoiceIn *sw, void *buf, size_t size)\n         return 0;\n     }\n \n-    rpos = audio_ring_posb(hw->conv_buf.pos, live, hw->conv_buf.size);\n-\n     samples = size / sw->info.bytes_per_frame;\n \n     swlim = (live * sw->ratio) >> 32;\n     swlim = MIN (swlim, samples);\n \n-    while (swlim) {\n-        src = hw->conv_buf.buffer + rpos;\n-        if (hw->conv_buf.pos > rpos) {\n-            isamp = hw->conv_buf.pos - rpos;\n-        } else {\n-            isamp = hw->conv_buf.size - rpos;\n-        }\n-\n-        if (!isamp) {\n-            break;\n-        }\n-        osamp = swlim;\n-\n-        st_rate_flow (sw->rate, src, dst, &isamp, &osamp);\n-        swlim -= osamp;\n-        rpos = (rpos + isamp) % hw->conv_buf.size;\n-        dst += osamp;\n-        ret += osamp;\n-        total += isamp;\n-    }\n+    audio_pcm_sw_resample_in(sw, live, swlim, &total, &ret);\n \n     if (!hw->pcm_ops->volume_in) {\n         mixeng_volume(sw->resample_buf.buffer, ret, &sw->vol);\n",
    "prefixes": [
        "11/17"
    ]
}