All of lore.kernel.org
 help / color / mirror / Atom feed
From: Gerd Hoffmann <kraxel@redhat.com>
To: qemu-devel@nongnu.org
Cc: Kővágó@redhat.com, "Gerd Hoffmann" <kraxel@redhat.com>,
	Zoltán <DirtY.iCE.hu@gmail.com>
Subject: [PULL 11/16] spiceaudio: port to the new audio backend api
Date: Tue, 24 Sep 2019 08:19:46 +0200	[thread overview]
Message-ID: <20190924061951.27916-12-kraxel@redhat.com> (raw)
In-Reply-To: <20190924061951.27916-1-kraxel@redhat.com>

From: Kővágó, Zoltán <dirty.ice.hu@gmail.com>

Signed-off-by: Kővágó, Zoltán <DirtY.iCE.hu@gmail.com>
Message-id: 4d3356df9ccbffee2f710b93d456443c81e3f011.1568927990.git.DirtY.iCE.hu@gmail.com
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 audio/spiceaudio.c | 116 ++++++++++++++++-----------------------------
 1 file changed, 42 insertions(+), 74 deletions(-)

diff --git a/audio/spiceaudio.c b/audio/spiceaudio.c
index 26873c7f22a5..ff4e4dcbb022 100644
--- a/audio/spiceaudio.c
+++ b/audio/spiceaudio.c
@@ -51,7 +51,7 @@ typedef struct SpiceVoiceOut {
     SpiceRateCtl          rate;
     int                   active;
     uint32_t              *frame;
-    uint32_t              *fpos;
+    uint32_t              fpos;
     uint32_t              fsize;
 } SpiceVoiceOut;
 
@@ -60,7 +60,6 @@ typedef struct SpiceVoiceIn {
     SpiceRecordInstance   sin;
     SpiceRateCtl          rate;
     int                   active;
-    uint32_t              samples[LINE_IN_SAMPLES];
 } SpiceVoiceIn;
 
 static const SpicePlaybackInterface playback_sif = {
@@ -152,44 +151,40 @@ static void line_out_fini (HWVoiceOut *hw)
     spice_server_remove_interface (&out->sin.base);
 }
 
-static size_t line_out_run (HWVoiceOut *hw, size_t live)
+static void *line_out_get_buffer(HWVoiceOut *hw, size_t *size)
 {
-    SpiceVoiceOut *out = container_of (hw, SpiceVoiceOut, hw);
-    size_t rpos, decr;
-    size_t samples;
+    SpiceVoiceOut *out = container_of(hw, SpiceVoiceOut, hw);
+    size_t decr;
 
-    if (!live) {
-        return 0;
+    if (!out->frame) {
+        spice_server_playback_get_buffer(&out->sin, &out->frame, &out->fsize);
+        out->fpos = 0;
     }
 
-    decr = rate_get_samples (&hw->info, &out->rate);
-    decr = MIN (live, decr);
+    if (out->frame) {
+        decr = rate_get_samples(&hw->info, &out->rate);
+        decr = MIN(out->fsize - out->fpos, decr);
 
-    samples = decr;
-    rpos = hw->rpos;
-    while (samples) {
-        int left_till_end_samples = hw->samples - rpos;
-        int len = MIN (samples, left_till_end_samples);
+        *size = decr << hw->info.shift;
+    } else {
+        rate_start(&out->rate);
+    }
+    return out->frame + out->fpos;
+}
+
+static size_t line_out_put_buffer(HWVoiceOut *hw, void *buf, size_t size)
+{
+    SpiceVoiceOut *out = container_of(hw, SpiceVoiceOut, hw);
 
-        if (!out->frame) {
-            spice_server_playback_get_buffer (&out->sin, &out->frame, &out->fsize);
-            out->fpos = out->frame;
-        }
-        if (out->frame) {
-            len = MIN (len, out->fsize);
-            hw->clip (out->fpos, hw->mix_buf + rpos, len);
-            out->fsize -= len;
-            out->fpos  += len;
-            if (out->fsize == 0) {
-                spice_server_playback_put_samples (&out->sin, out->frame);
-                out->frame = out->fpos = NULL;
-            }
-        }
-        rpos = (rpos + len) % hw->samples;
-        samples -= len;
+    assert(buf == out->frame + out->fpos && out->fpos <= out->fsize);
+    out->fpos += size >> 2;
+
+    if (out->fpos == out->fsize) { /* buffer full */
+        spice_server_playback_put_samples(&out->sin, out->frame);
+        out->frame = NULL;
     }
-    hw->rpos = rpos;
-    return decr;
+
+    return size;
 }
 
 static int line_out_ctl (HWVoiceOut *hw, int cmd, ...)
@@ -211,9 +206,9 @@ static int line_out_ctl (HWVoiceOut *hw, int cmd, ...)
         }
         out->active = 0;
         if (out->frame) {
-            memset (out->fpos, 0, out->fsize << 2);
+            memset(out->frame + out->fpos, 0, (out->fsize - out->fpos) << 2);
             spice_server_playback_put_samples (&out->sin, out->frame);
-            out->frame = out->fpos = NULL;
+            out->frame = NULL;
         }
         spice_server_playback_stop (&out->sin);
         break;
@@ -275,49 +270,20 @@ static void line_in_fini (HWVoiceIn *hw)
     spice_server_remove_interface (&in->sin.base);
 }
 
-static size_t line_in_run(HWVoiceIn *hw)
+static size_t line_in_read(HWVoiceIn *hw, void *buf, size_t len)
 {
     SpiceVoiceIn *in = container_of (hw, SpiceVoiceIn, hw);
-    size_t num_samples;
-    int ready;
-    size_t len[2];
-    uint64_t delta_samp;
-    const uint32_t *samples;
+    uint64_t delta_samp = rate_get_samples(&hw->info, &in->rate);
+    uint64_t to_read = MIN(len >> 2, delta_samp);
+    size_t ready = spice_server_record_get_samples(&in->sin, buf, to_read);
 
-    if (!(num_samples = hw->samples - audio_pcm_hw_get_live_in (hw))) {
-        return 0;
-    }
-
-    delta_samp = rate_get_samples (&hw->info, &in->rate);
-    num_samples = MIN (num_samples, delta_samp);
-
-    ready = spice_server_record_get_samples (&in->sin, in->samples, num_samples);
-    samples = in->samples;
+    /* XXX: do we need this? */
     if (ready == 0) {
-        static const uint32_t silence[LINE_IN_SAMPLES];
-        samples = silence;
-        ready = LINE_IN_SAMPLES;
+        memset(buf, 0, to_read << 2);
+        ready = to_read;
     }
 
-    num_samples = MIN (ready, num_samples);
-
-    if (hw->wpos + num_samples > hw->samples) {
-        len[0] = hw->samples - hw->wpos;
-        len[1] = num_samples - len[0];
-    } else {
-        len[0] = num_samples;
-        len[1] = 0;
-    }
-
-    hw->conv (hw->conv_buf + hw->wpos, samples, len[0]);
-
-    if (len[1]) {
-        hw->conv (hw->conv_buf, samples + len[0], len[1]);
-    }
-
-    hw->wpos = (hw->wpos + num_samples) % hw->samples;
-
-    return num_samples;
+    return ready << 2;
 }
 
 static int line_in_ctl (HWVoiceIn *hw, int cmd, ...)
@@ -366,12 +332,14 @@ static int line_in_ctl (HWVoiceIn *hw, int cmd, ...)
 static struct audio_pcm_ops audio_callbacks = {
     .init_out = line_out_init,
     .fini_out = line_out_fini,
-    .run_out  = line_out_run,
+    .write    = audio_generic_write,
+    .get_buffer_out = line_out_get_buffer,
+    .put_buffer_out = line_out_put_buffer,
     .ctl_out  = line_out_ctl,
 
     .init_in  = line_in_init,
     .fini_in  = line_in_fini,
-    .run_in   = line_in_run,
+    .read     = line_in_read,
     .ctl_in   = line_in_ctl,
 };
 
-- 
2.18.1



  parent reply	other threads:[~2019-09-24  6:34 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-09-24  6:19 [PULL 00/16] Audio 20190924 patches Gerd Hoffmann
2019-09-24  6:19 ` [PULL 01/16] audio: fix buffer-length typo in documentation Gerd Hoffmann
2019-09-24  6:19 ` [PULL 02/16] audio: fix ALSA period-length " Gerd Hoffmann
2019-09-24  6:19 ` [PULL 03/16] audio: api for mixeng code free backends Gerd Hoffmann
2019-09-24  6:19 ` [PULL 04/16] alsaaudio: port to the new audio backend api Gerd Hoffmann
2019-09-24  6:19 ` [PULL 05/16] coreaudio: " Gerd Hoffmann
2019-09-24  6:19 ` [PULL 06/16] dsoundaudio: " Gerd Hoffmann
2019-09-24  6:19 ` [PULL 07/16] noaudio: " Gerd Hoffmann
2019-09-24  6:19 ` [PULL 08/16] ossaudio: " Gerd Hoffmann
2019-09-24  6:19 ` [PULL 09/16] paaudio: " Gerd Hoffmann
2019-09-24  6:19 ` [PULL 10/16] sdlaudio: " Gerd Hoffmann
2019-09-24  6:19 ` Gerd Hoffmann [this message]
2019-09-24  6:19 ` [PULL 12/16] wavaudio: " Gerd Hoffmann
2019-09-24  6:19 ` [PULL 13/16] audio: remove remains of the old " Gerd Hoffmann
2019-09-24  6:19 ` [PULL 14/16] audio: unify input and output mixeng buffer management Gerd Hoffmann
2019-09-24  6:19 ` [PULL 15/16] audio: common rate control code for timer based outputs Gerd Hoffmann
2019-09-24  6:19 ` [PULL 16/16] audio: split ctl_* functions into enable_* and volume_* Gerd Hoffmann
2019-09-24 14:36 ` [PULL 00/16] Audio 20190924 patches Peter Maydell

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190924061951.27916-12-kraxel@redhat.com \
    --to=kraxel@redhat.com \
    --cc=DirtY.iCE.hu@gmail.com \
    --cc=Kővágó@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.