get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 1726709,
    "url": "http://patchwork.ozlabs.org/api/patches/1726709/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20230115131224.30751-1-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-1-volker.ruemelin@t-online.de>",
    "list_archive_url": null,
    "date": "2023-01-15T13:12:08",
    "name": "[01/17] audio: change type of mix_buf and conv_buf",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "2b38b3fed87b4c2ccbc5416c3a03d3d5f94b90af",
    "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-1-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/1726709/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/1726709/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 4NvwYm3yjFz23g1\n\tfor <incoming@patchwork.ozlabs.org>; Mon, 16 Jan 2023 00:12:44 +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 1pH2oK-0003xq-Fh; Sun, 15 Jan 2023 08:12:32 -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 1pH2oI-0003xi-CV\n for qemu-devel@nongnu.org; Sun, 15 Jan 2023 08:12:30 -0500",
            "from mailout04.t-online.de ([194.25.134.18])\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 1pH2oF-000585-Rr\n for qemu-devel@nongnu.org; Sun, 15 Jan 2023 08:12:30 -0500",
            "from fwd76.dcpf.telekom.de (fwd76.aul.t-online.de [10.223.144.102])\n by mailout04.t-online.de (Postfix) with SMTP id EC1A0230F2;\n Sun, 15 Jan 2023 14:12:24 +0100 (CET)",
            "from linpower.localnet ([79.208.25.151]) by fwd76.t-online.de\n with (TLSv1.3:TLS_AES_256_GCM_SHA384 encrypted)\n esmtp id 1pH2oC-3NPIA50; Sun, 15 Jan 2023 14:12:24 +0100",
            "by linpower.localnet (Postfix, from userid 1000)\n id 536AE200623; 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 01/17] audio: change type of mix_buf and conv_buf",
        "Date": "Sun, 15 Jan 2023 14:12:08 +0100",
        "Message-Id": "<20230115131224.30751-1-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": "6dee40a4-d82d-4115-921c-bd42e6864451",
        "Received-SPF": "none client-ip=194.25.134.18;\n envelope-from=volker.ruemelin@t-online.de; helo=mailout04.t-online.de",
        "X-Spam_score_int": "-18",
        "X-Spam_score": "-1.9",
        "X-Spam_bar": "-",
        "X-Spam_report": "(-1.9 / 5.0 requ) BAYES_00=-1.9, FREEMAIL_FROM=0.001,\n RCVD_IN_DNSWL_NONE=-0.0001, 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\nChange the type of mix_buf in struct HWVoiceOut and conv_buf\nin struct HWVoiceIn from STSampleBuffer * to STSampleBuffer.\nHowever, a buffer pointer is still needed. For this reason in\nstruct STSampleBuffer samples[] is changed to *buffer.\n\nThis is a preparation for the next patch. The next patch will\nadd this line, which is not possible with the current struct\nSTSampleBuffer definition.\n\n+        sw->resample_buf.buffer = hw->mix_buf.buffer + rpos2;\n\nThere are no functional changes.\n\nSigned-off-by: Volker Rümelin <vr_qemu@t-online.de>\n---\n audio/audio.c          | 106 ++++++++++++++++++++---------------------\n audio/audio_int.h      |   6 +--\n audio/audio_template.h |  19 ++++----\n 3 files changed, 67 insertions(+), 64 deletions(-)",
    "diff": "diff --git a/audio/audio.c b/audio/audio.c\nindex fb0d4a2cac..6a17b3bb2f 100644\n--- a/audio/audio.c\n+++ b/audio/audio.c\n@@ -521,8 +521,8 @@ static size_t audio_pcm_hw_find_min_in (HWVoiceIn *hw)\n static size_t audio_pcm_hw_get_live_in(HWVoiceIn *hw)\n {\n     size_t live = hw->total_samples_captured - audio_pcm_hw_find_min_in (hw);\n-    if (audio_bug(__func__, live > hw->conv_buf->size)) {\n-        dolog(\"live=%zu hw->conv_buf->size=%zu\\n\", live, hw->conv_buf->size);\n+    if (audio_bug(__func__, live > hw->conv_buf.size)) {\n+        dolog(\"live=%zu hw->conv_buf.size=%zu\\n\", live, hw->conv_buf.size);\n         return 0;\n     }\n     return live;\n@@ -531,13 +531,13 @@ static size_t audio_pcm_hw_get_live_in(HWVoiceIn *hw)\n static size_t audio_pcm_hw_conv_in(HWVoiceIn *hw, void *pcm_buf, size_t samples)\n {\n     size_t conv = 0;\n-    STSampleBuffer *conv_buf = hw->conv_buf;\n+    STSampleBuffer *conv_buf = &hw->conv_buf;\n \n     while (samples) {\n         uint8_t *src = advance(pcm_buf, conv * hw->info.bytes_per_frame);\n         size_t proc = MIN(samples, conv_buf->size - conv_buf->pos);\n \n-        hw->conv(conv_buf->samples + conv_buf->pos, src, proc);\n+        hw->conv(conv_buf->buffer + conv_buf->pos, src, proc);\n         conv_buf->pos = (conv_buf->pos + proc) % conv_buf->size;\n         samples -= proc;\n         conv += proc;\n@@ -559,12 +559,12 @@ static size_t audio_pcm_sw_read(SWVoiceIn *sw, void *buf, size_t size)\n     if (!live) {\n         return 0;\n     }\n-    if (audio_bug(__func__, live > hw->conv_buf->size)) {\n-        dolog(\"live_in=%zu hw->conv_buf->size=%zu\\n\", live, hw->conv_buf->size);\n+    if (audio_bug(__func__, live > hw->conv_buf.size)) {\n+        dolog(\"live_in=%zu hw->conv_buf.size=%zu\\n\", live, hw->conv_buf.size);\n         return 0;\n     }\n \n-    rpos = audio_ring_posb(hw->conv_buf->pos, live, hw->conv_buf->size);\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@@ -572,11 +572,11 @@ static size_t audio_pcm_sw_read(SWVoiceIn *sw, void *buf, size_t size)\n     swlim = MIN (swlim, samples);\n \n     while (swlim) {\n-        src = hw->conv_buf->samples + rpos;\n-        if (hw->conv_buf->pos > rpos) {\n-            isamp = hw->conv_buf->pos - rpos;\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+            isamp = hw->conv_buf.size - rpos;\n         }\n \n         if (!isamp) {\n@@ -586,7 +586,7 @@ static size_t audio_pcm_sw_read(SWVoiceIn *sw, void *buf, size_t size)\n \n         st_rate_flow (sw->rate, src, dst, &isamp, &osamp);\n         swlim -= osamp;\n-        rpos = (rpos + isamp) % hw->conv_buf->size;\n+        rpos = (rpos + isamp) % hw->conv_buf.size;\n         dst += osamp;\n         ret += osamp;\n         total += isamp;\n@@ -634,8 +634,8 @@ static size_t audio_pcm_hw_get_live_out (HWVoiceOut *hw, int *nb_live)\n     if (nb_live1) {\n         size_t live = smin;\n \n-        if (audio_bug(__func__, live > hw->mix_buf->size)) {\n-            dolog(\"live=%zu hw->mix_buf->size=%zu\\n\", live, hw->mix_buf->size);\n+        if (audio_bug(__func__, live > hw->mix_buf.size)) {\n+            dolog(\"live=%zu hw->mix_buf.size=%zu\\n\", live, hw->mix_buf.size);\n             return 0;\n         }\n         return live;\n@@ -652,17 +652,17 @@ static size_t audio_pcm_hw_get_free(HWVoiceOut *hw)\n static void audio_pcm_hw_clip_out(HWVoiceOut *hw, void *pcm_buf, size_t len)\n {\n     size_t clipped = 0;\n-    size_t pos = hw->mix_buf->pos;\n+    size_t pos = hw->mix_buf.pos;\n \n     while (len) {\n-        st_sample *src = hw->mix_buf->samples + pos;\n+        st_sample *src = hw->mix_buf.buffer + pos;\n         uint8_t *dst = advance(pcm_buf, clipped * hw->info.bytes_per_frame);\n-        size_t samples_till_end_of_buf = hw->mix_buf->size - pos;\n+        size_t samples_till_end_of_buf = hw->mix_buf.size - pos;\n         size_t samples_to_clip = MIN(len, samples_till_end_of_buf);\n \n         hw->clip(dst, src, samples_to_clip);\n \n-        pos = (pos + samples_to_clip) % hw->mix_buf->size;\n+        pos = (pos + samples_to_clip) % hw->mix_buf.size;\n         len -= samples_to_clip;\n         clipped += samples_to_clip;\n     }\n@@ -681,11 +681,11 @@ static size_t audio_pcm_sw_write(SWVoiceOut *sw, void *buf, size_t size)\n         return size;\n     }\n \n-    hwsamples = sw->hw->mix_buf->size;\n+    hwsamples = sw->hw->mix_buf.size;\n \n     live = sw->total_hw_samples_mixed;\n     if (audio_bug(__func__, live > hwsamples)) {\n-        dolog(\"live=%zu hw->mix_buf->size=%zu\\n\", live, hwsamples);\n+        dolog(\"live=%zu hw->mix_buf.size=%zu\\n\", live, hwsamples);\n         return 0;\n     }\n \n@@ -696,7 +696,7 @@ static size_t audio_pcm_sw_write(SWVoiceOut *sw, void *buf, size_t size)\n         return 0;\n     }\n \n-    wpos = (sw->hw->mix_buf->pos + live) % hwsamples;\n+    wpos = (sw->hw->mix_buf.pos + live) % hwsamples;\n \n     dead = hwsamples - live;\n     hw_free = audio_pcm_hw_get_free(sw->hw);\n@@ -723,7 +723,7 @@ static size_t audio_pcm_sw_write(SWVoiceOut *sw, void *buf, size_t size)\n         st_rate_flow_mix (\n             sw->rate,\n             sw->buf + pos,\n-            sw->hw->mix_buf->samples + wpos,\n+            sw->hw->mix_buf.buffer + wpos,\n             &isamp,\n             &osamp\n             );\n@@ -987,9 +987,9 @@ static size_t audio_get_avail (SWVoiceIn *sw)\n     }\n \n     live = sw->hw->total_samples_captured - sw->total_hw_samples_acquired;\n-    if (audio_bug(__func__, live > sw->hw->conv_buf->size)) {\n-        dolog(\"live=%zu sw->hw->conv_buf->size=%zu\\n\", live,\n-              sw->hw->conv_buf->size);\n+    if (audio_bug(__func__, live > sw->hw->conv_buf.size)) {\n+        dolog(\"live=%zu sw->hw->conv_buf.size=%zu\\n\", live,\n+              sw->hw->conv_buf.size);\n         return 0;\n     }\n \n@@ -1024,13 +1024,13 @@ static size_t audio_get_free(SWVoiceOut *sw)\n \n     live = sw->total_hw_samples_mixed;\n \n-    if (audio_bug(__func__, live > sw->hw->mix_buf->size)) {\n-        dolog(\"live=%zu sw->hw->mix_buf->size=%zu\\n\", live,\n-              sw->hw->mix_buf->size);\n+    if (audio_bug(__func__, live > sw->hw->mix_buf.size)) {\n+        dolog(\"live=%zu sw->hw->mix_buf.size=%zu\\n\", live,\n+              sw->hw->mix_buf.size);\n         return 0;\n     }\n \n-    dead = sw->hw->mix_buf->size - live;\n+    dead = sw->hw->mix_buf.size - live;\n \n #ifdef DEBUG_OUT\n     dolog(\"%s: get_free live %zu dead %zu frontend frames %zu\\n\",\n@@ -1054,12 +1054,12 @@ static void audio_capture_mix_and_clear(HWVoiceOut *hw, size_t rpos,\n \n             n = samples;\n             while (n) {\n-                size_t till_end_of_hw = hw->mix_buf->size - rpos2;\n+                size_t till_end_of_hw = hw->mix_buf.size - rpos2;\n                 size_t to_write = MIN(till_end_of_hw, n);\n                 size_t bytes = to_write * hw->info.bytes_per_frame;\n                 size_t written;\n \n-                sw->buf = hw->mix_buf->samples + rpos2;\n+                sw->buf = hw->mix_buf.buffer + rpos2;\n                 written = audio_pcm_sw_write (sw, NULL, bytes);\n                 if (written - bytes) {\n                     dolog(\"Could not mix %zu bytes into a capture \"\n@@ -1068,14 +1068,14 @@ static void audio_capture_mix_and_clear(HWVoiceOut *hw, size_t rpos,\n                     break;\n                 }\n                 n -= to_write;\n-                rpos2 = (rpos2 + to_write) % hw->mix_buf->size;\n+                rpos2 = (rpos2 + to_write) % hw->mix_buf.size;\n             }\n         }\n     }\n \n-    n = MIN(samples, hw->mix_buf->size - rpos);\n-    mixeng_clear(hw->mix_buf->samples + rpos, n);\n-    mixeng_clear(hw->mix_buf->samples, samples - n);\n+    n = MIN(samples, hw->mix_buf.size - rpos);\n+    mixeng_clear(hw->mix_buf.buffer + rpos, n);\n+    mixeng_clear(hw->mix_buf.buffer, samples - n);\n }\n \n static size_t audio_pcm_hw_run_out(HWVoiceOut *hw, size_t live)\n@@ -1101,7 +1101,7 @@ static size_t audio_pcm_hw_run_out(HWVoiceOut *hw, size_t live)\n \n         live -= proc;\n         clipped += proc;\n-        hw->mix_buf->pos = (hw->mix_buf->pos + proc) % hw->mix_buf->size;\n+        hw->mix_buf.pos = (hw->mix_buf.pos + proc) % hw->mix_buf.size;\n \n         if (proc == 0 || proc < decr) {\n             break;\n@@ -1172,8 +1172,8 @@ static void audio_run_out (AudioState *s)\n             live = 0;\n         }\n \n-        if (audio_bug(__func__, live > hw->mix_buf->size)) {\n-            dolog(\"live=%zu hw->mix_buf->size=%zu\\n\", live, hw->mix_buf->size);\n+        if (audio_bug(__func__, live > hw->mix_buf.size)) {\n+            dolog(\"live=%zu hw->mix_buf.size=%zu\\n\", live, hw->mix_buf.size);\n             continue;\n         }\n \n@@ -1201,13 +1201,13 @@ static void audio_run_out (AudioState *s)\n             continue;\n         }\n \n-        prev_rpos = hw->mix_buf->pos;\n+        prev_rpos = hw->mix_buf.pos;\n         played = audio_pcm_hw_run_out(hw, live);\n         replay_audio_out(&played);\n-        if (audio_bug(__func__, hw->mix_buf->pos >= hw->mix_buf->size)) {\n-            dolog(\"hw->mix_buf->pos=%zu hw->mix_buf->size=%zu played=%zu\\n\",\n-                  hw->mix_buf->pos, hw->mix_buf->size, played);\n-            hw->mix_buf->pos = 0;\n+        if (audio_bug(__func__, hw->mix_buf.pos >= hw->mix_buf.size)) {\n+            dolog(\"hw->mix_buf.pos=%zu hw->mix_buf.size=%zu played=%zu\\n\",\n+                  hw->mix_buf.pos, hw->mix_buf.size, played);\n+            hw->mix_buf.pos = 0;\n         }\n \n #ifdef DEBUG_OUT\n@@ -1288,10 +1288,10 @@ static void audio_run_in (AudioState *s)\n \n         if (replay_mode != REPLAY_MODE_PLAY) {\n             captured = audio_pcm_hw_run_in(\n-                hw, hw->conv_buf->size - audio_pcm_hw_get_live_in(hw));\n+                hw, hw->conv_buf.size - audio_pcm_hw_get_live_in(hw));\n         }\n-        replay_audio_in(&captured, hw->conv_buf->samples, &hw->conv_buf->pos,\n-                        hw->conv_buf->size);\n+        replay_audio_in(&captured, hw->conv_buf.buffer, &hw->conv_buf.pos,\n+                        hw->conv_buf.size);\n \n         min = audio_pcm_hw_find_min_in (hw);\n         hw->total_samples_captured += captured - min;\n@@ -1324,14 +1324,14 @@ static void audio_run_capture (AudioState *s)\n         SWVoiceOut *sw;\n \n         captured = live = audio_pcm_hw_get_live_out (hw, NULL);\n-        rpos = hw->mix_buf->pos;\n+        rpos = hw->mix_buf.pos;\n         while (live) {\n-            size_t left = hw->mix_buf->size - rpos;\n+            size_t left = hw->mix_buf.size - rpos;\n             size_t to_capture = MIN(live, left);\n             struct st_sample *src;\n             struct capture_callback *cb;\n \n-            src = hw->mix_buf->samples + rpos;\n+            src = hw->mix_buf.buffer + rpos;\n             hw->clip (cap->buf, src, to_capture);\n             mixeng_clear (src, to_capture);\n \n@@ -1339,10 +1339,10 @@ static void audio_run_capture (AudioState *s)\n                 cb->ops.capture (cb->opaque, cap->buf,\n                                  to_capture * hw->info.bytes_per_frame);\n             }\n-            rpos = (rpos + to_capture) % hw->mix_buf->size;\n+            rpos = (rpos + to_capture) % hw->mix_buf.size;\n             live -= to_capture;\n         }\n-        hw->mix_buf->pos = rpos;\n+        hw->mix_buf.pos = rpos;\n \n         for (sw = hw->sw_head.lh_first; sw; sw = sw->entries.le_next) {\n             if (!sw->active && sw->empty) {\n@@ -1901,7 +1901,7 @@ CaptureVoiceOut *AUD_add_capture(\n \n         audio_pcm_init_info (&hw->info, as);\n \n-        cap->buf = g_malloc0_n(hw->mix_buf->size, hw->info.bytes_per_frame);\n+        cap->buf = g_malloc0_n(hw->mix_buf.size, hw->info.bytes_per_frame);\n \n         if (hw->info.is_float) {\n             hw->clip = mixeng_clip_float[hw->info.nchannels == 2];\n@@ -1953,7 +1953,7 @@ void AUD_del_capture (CaptureVoiceOut *cap, void *cb_opaque)\n                     sw = sw1;\n                 }\n                 QLIST_REMOVE (cap, entries);\n-                g_free (cap->hw.mix_buf);\n+                g_free(cap->hw.mix_buf.buffer);\n                 g_free (cap->buf);\n                 g_free (cap);\n             }\ndiff --git a/audio/audio_int.h b/audio/audio_int.h\nindex 9d04be9128..900b0a6255 100644\n--- a/audio/audio_int.h\n+++ b/audio/audio_int.h\n@@ -58,7 +58,7 @@ typedef struct SWVoiceCap SWVoiceCap;\n \n typedef struct STSampleBuffer {\n     size_t pos, size;\n-    st_sample samples[];\n+    st_sample *buffer;\n } STSampleBuffer;\n \n typedef struct HWVoiceOut {\n@@ -71,7 +71,7 @@ typedef struct HWVoiceOut {\n     f_sample *clip;\n     uint64_t ts_helper;\n \n-    STSampleBuffer *mix_buf;\n+    STSampleBuffer mix_buf;\n     void *buf_emul;\n     size_t pos_emul, pending_emul, size_emul;\n \n@@ -93,7 +93,7 @@ typedef struct HWVoiceIn {\n     size_t total_samples_captured;\n     uint64_t ts_helper;\n \n-    STSampleBuffer *conv_buf;\n+    STSampleBuffer conv_buf;\n     void *buf_emul;\n     size_t pos_emul, pending_emul, size_emul;\n \ndiff --git a/audio/audio_template.h b/audio/audio_template.h\nindex 9c600448fb..9283f00e9e 100644\n--- a/audio/audio_template.h\n+++ b/audio/audio_template.h\n@@ -71,8 +71,9 @@ static void glue(audio_init_nb_voices_, TYPE)(AudioState *s,\n static void glue (audio_pcm_hw_free_resources_, TYPE) (HW *hw)\n {\n     g_free(hw->buf_emul);\n-    g_free (HWBUF);\n-    HWBUF = NULL;\n+    g_free(HWBUF.buffer);\n+    HWBUF.buffer = NULL;\n+    HWBUF.size = 0;\n }\n \n static void glue(audio_pcm_hw_alloc_resources_, TYPE)(HW *hw)\n@@ -83,10 +84,12 @@ static void glue(audio_pcm_hw_alloc_resources_, TYPE)(HW *hw)\n             dolog(\"Attempted to allocate empty buffer\\n\");\n         }\n \n-        HWBUF = g_malloc0(sizeof(STSampleBuffer) + sizeof(st_sample) * samples);\n-        HWBUF->size = samples;\n+        HWBUF.buffer = g_new0(st_sample, samples);\n+        HWBUF.size = samples;\n+        HWBUF.pos = 0;\n     } else {\n-        HWBUF = NULL;\n+        HWBUF.buffer = NULL;\n+        HWBUF.size = 0;\n     }\n }\n \n@@ -111,16 +114,16 @@ static int glue (audio_pcm_sw_alloc_resources_, TYPE) (SW *sw)\n     }\n \n #ifdef DAC\n-    samples = ((int64_t) sw->HWBUF->size << 32) / sw->ratio;\n+    samples = ((int64_t)sw->HWBUF.size << 32) / sw->ratio;\n #else\n-    samples = (int64_t)sw->HWBUF->size * sw->ratio >> 32;\n+    samples = (int64_t)sw->HWBUF.size * sw->ratio >> 32;\n #endif\n     if (samples == 0) {\n         HW *hw = sw->hw;\n         size_t f_fe_min;\n \n         /* f_fe_min = ceil(1 [frames] * f_be [Hz] / size_be [frames]) */\n-        f_fe_min = (hw->info.freq + HWBUF->size - 1) / HWBUF->size;\n+        f_fe_min = (hw->info.freq + HWBUF.size - 1) / HWBUF.size;\n         qemu_log_mask(LOG_UNIMP,\n                       AUDIO_CAP \": The guest selected a \" NAME \" sample rate\"\n                       \" of %d Hz for %s. Only sample rates >= %zu Hz are\"\n",
    "prefixes": [
        "01/17"
    ]
}