All of lore.kernel.org
 help / color / mirror / Atom feed
From: Emmanouil Pitsidianakis <manos.pitsidianakis@linaro.org>
To: qemu-devel@nongnu.org
Cc: "Emmanouil Pitsidianakis" <manos.pitsidianakis@linaro.org>,
	"Igor Skalkin" <Igor.Skalkin@opensynergy.com>,
	"Anton Yakovlev" <Anton.Yakovlev@opensynergy.com>,
	"Paolo Bonzini" <pbonzini@redhat.com>,
	"Gerd Hoffmann" <kraxel@redhat.com>,
	"Michael S. Tsirkin" <mst@redhat.com>,
	"Marcel Apfelbaum" <marcel.apfelbaum@gmail.com>,
	"Daniel P. Berrangé" <berrange@redhat.com>,
	"Eduardo Habkost" <eduardo@habkost.net>,
	"Marc-André Lureau" <marcandre.lureau@redhat.com>,
	"Volker Rümelin" <vr_qemu@t-online.de>,
	"Kővágó, Zoltán" <DirtY.iCE.hu@gmail.com>,
	"Alex Bennée" <alex.bennee@linaro.org>,
	"Philippe Mathieu-Daudé" <philmd@linaro.org>
Subject: [PATCH v6 00/12] Add VIRTIO sound card
Date: Tue, 15 Aug 2023 12:07:05 +0300	[thread overview]
Message-ID: <cover.1692089917.git.manos.pitsidianakis@linaro.org> (raw)


This patch series adds an audio device implementing the recent virtio 
sound spec (1.2) and a corresponding PCI wrapper device.

https://github.com/epilys/qemu-virtio-snd/tree/virtio-snd-v6

Main differences with v5 patch series [^v5]
<cover.1690626150.git.manos.pitsidianakis@linaro.org>:

- Free any existing PCM stream resources before allocating a new one.
- Add docs.

[^v5]: 
https://lore.kernel.org/qemu-devel/cover.1690626150.git.manos.pitsidianakis@linaro.org/

Previously:

[^v4]: 
https://lore.kernel.org/qemu-devel/cover.1689857559.git.manos.pitsidianakis@linaro.org/
[^v3]: 
https://lore.kernel.org/qemu-devel/cover.1689692765.git.manos.pitsidianakis@linaro.org/


Emmanouil Pitsidianakis (12):
  Add virtio-sound device stub
  Add virtio-sound-pci device
  virtio-sound: handle control messages and streams
  virtio-sound: set PCM stream parameters
  virtio-sound: handle VIRTIO_SND_R_PCM_INFO request
  virtio-sound: handle VIRTIO_SND_R_PCM_{START,STOP}
  virtio-sound: handle VIRTIO_SND_PCM_SET_PARAMS
  virtio-sound: handle VIRTIO_SND_R_PCM_PREPARE
  virtio-sound: handle VIRTIO_SND_PCM_RELEASE
  virtio-sound: implement audio output (TX)
  virtio-sound: implement audio capture (RX)
  docs/system: add basic virtio-snd documentation

 MAINTAINERS                        |    6 +
 docs/system/device-emulation.rst   |    1 +
 docs/system/devices/virtio-snd.rst |   36 +
 hw/virtio/Kconfig                  |    5 +
 hw/virtio/meson.build              |    2 +
 hw/virtio/trace-events             |   20 +
 hw/virtio/virtio-snd-pci.c         |   91 ++
 hw/virtio/virtio-snd.c             | 1308 ++++++++++++++++++++++++++++
 include/hw/pci/pci.h               |    1 +
 include/hw/virtio/virtio-snd.h     |  158 ++++
 softmmu/qdev-monitor.c             |    1 +
 11 files changed, 1629 insertions(+)
 create mode 100644 docs/system/devices/virtio-snd.rst
 create mode 100644 hw/virtio/virtio-snd-pci.c
 create mode 100644 hw/virtio/virtio-snd.c
 create mode 100644 include/hw/virtio/virtio-snd.h

Range-diff against v5:
 1:  899b9a06bb =  1:  86f98e0b7d Add virtio-sound device stub
 2:  035be510f8 =  2:  8f996f9aed Add virtio-sound-pci device
 3:  e6a3624f89 !  3:  66eac6c1e0 virtio-sound: handle control messages and streams
    @@ hw/virtio/virtio-snd.c: static void virtio_snd_realize(DeviceState *dev, Error *
      }
      
     +/*
    -+ * Close the sound card.
    ++ * Close the stream and free its resources.
     + *
     + * @stream: VirtIOSoundPCMStream *stream
     + */
     +static void virtio_snd_pcm_close(VirtIOSoundPCMStream *stream)
     +{
    -+    virtio_snd_process_cmdq(stream->s);
     +}
     +
      static void virtio_snd_unrealize(DeviceState *dev)
    @@ hw/virtio/virtio-snd.c: static void virtio_snd_realize(DeviceState *dev, Error *
      
          trace_virtio_snd_unrealize(vsnd);
      
    -+    for (uint32_t i = 0; i < vsnd->snd_conf.streams; i++) {
    -+        stream = vsnd->pcm->streams[i];
    -+        virtio_snd_pcm_close(stream);
    -+        g_free(stream);
    ++    if (vsnd->pcm) {
    ++        if (vsnd->pcm->streams) {
    ++            for (uint32_t i = 0; i < vsnd->snd_conf.streams; i++) {
    ++                stream = vsnd->pcm->streams[i];
    ++                if (stream) {
    ++                    virtio_snd_process_cmdq(stream->s);
    ++                    virtio_snd_pcm_close(stream);
    ++                    g_free(stream);
    ++                }
    ++            }
    ++            g_free(vsnd->pcm->streams);
    ++        }
    ++        g_free(vsnd->pcm);
    ++        vsnd->pcm = NULL;
     +    }
          AUD_remove_card(&vsnd->card);
    -+    g_free(vsnd->pcm);
          virtio_cleanup(vdev);
      }
      
 4:  82c80e2ae4 !  4:  fbb22214f2 virtio-sound: set PCM stream parameters
    @@ hw/virtio/virtio-snd.c: virtio_snd_set_config(VirtIODevice *vdev, const uint8_t
     +
     +    return VIRTIO_SND_S_OK;
     +}
    ++
    ++/*
    ++ * Get a QEMU Audiosystem compatible format value from a VIRTIO_SND_PCM_FMT_*
    ++ */
    ++static AudioFormat virtio_snd_get_qemu_format(uint32_t format)
    ++{
    ++    #define CASE(FMT)               \
    ++    case VIRTIO_SND_PCM_FMT_##FMT:  \
    ++        return AUDIO_FORMAT_##FMT;
    ++
    ++    switch (format) {
    ++    CASE(U8)
    ++    CASE(S8)
    ++    CASE(U16)
    ++    CASE(S16)
    ++    CASE(U32)
    ++    CASE(S32)
    ++    case VIRTIO_SND_PCM_FMT_FLOAT:
    ++        return AUDIO_FORMAT_F32;
    ++    default:
    ++        g_assert_not_reached();
    ++    }
    ++
    ++    #undef CASE
    ++}
    ++
    ++/*
    ++ * Get a QEMU Audiosystem compatible frequency value from a
    ++ * VIRTIO_SND_PCM_RATE_*
    ++ */
    ++static uint32_t virtio_snd_get_qemu_freq(uint32_t rate)
    ++{
    ++    #define CASE(RATE)               \
    ++    case VIRTIO_SND_PCM_RATE_##RATE: \
    ++        return RATE;
    ++
    ++    switch (rate) {
    ++    CASE(5512)
    ++    CASE(8000)
    ++    CASE(11025)
    ++    CASE(16000)
    ++    CASE(22050)
    ++    CASE(32000)
    ++    CASE(44100)
    ++    CASE(48000)
    ++    CASE(64000)
    ++    CASE(88200)
    ++    CASE(96000)
    ++    CASE(176400)
    ++    CASE(192000)
    ++    CASE(384000)
    ++    default:
    ++        g_assert_not_reached();
    ++    }
    ++
    ++    #undef CASE
    ++}
    ++
    ++/*
    ++ * Get QEMU Audiosystem compatible audsettings from virtio based pcm stream
    ++ * params.
    ++ */
    ++static void virtio_snd_get_qemu_audsettings(audsettings *as,
    ++                                            VirtIOSoundPCMParams *params)
    ++{
    ++    as->nchannels = MIN(AUDIO_MAX_CHANNELS, params->channels);
    ++    as->fmt = virtio_snd_get_qemu_format(params->format);
    ++    as->freq = virtio_snd_get_qemu_freq(params->rate);
    ++    as->endianness = AUDIO_HOST_ENDIANNESS;
    ++}
    ++
    ++/*
    ++ * Close a stream and free all its resources.
    ++ *
    ++ * @stream: VirtIOSoundPCMStream *stream
    ++ */
    ++static void virtio_snd_pcm_close(VirtIOSoundPCMStream *stream)
    ++{
    ++    if (stream) {
    ++        qemu_mutex_destroy(&stream->queue_mutex);
    ++        g_free(stream);
    ++    }
    ++}
    ++
    ++/*
    ++ * Prepares a VirtIOSound card stream.
    ++ * Returns the response status code. (VIRTIO_SND_S_*).
    ++ *
    ++ * @s: VirtIOSound device
    ++ * @stream_id: stream id
    ++ */
    ++static uint32_t virtio_snd_pcm_prepare_impl(VirtIOSound *s, uint32_t stream_id)
    ++{
    ++    audsettings as;
    ++    VirtIOSoundPCMParams *params;
    ++    VirtIOSoundPCMStream *stream;
    ++
    ++    if (!s->pcm->streams ||
    ++        !s->pcm->pcm_params ||
    ++        !s->pcm->pcm_params[stream_id]) {
    ++        return VIRTIO_SND_S_BAD_MSG;
    ++    }
    ++
    ++    params = virtio_snd_pcm_get_params(s, stream_id);
    ++    if (!params) {
    ++        return VIRTIO_SND_S_BAD_MSG;
    ++    }
    ++
    ++    virtio_snd_get_qemu_audsettings(&as, params);
    ++
    ++    virtio_snd_pcm_close(s->pcm->streams[stream_id]);
    ++
    ++    stream = g_new0(VirtIOSoundPCMStream, 1);
    ++
    ++    stream->id = stream_id;
    ++    stream->pcm = s->pcm;
    ++    stream->direction = stream_id < s->snd_conf.streams / 2 +
    ++        (s->snd_conf.streams & 1) ? VIRTIO_SND_D_OUTPUT : VIRTIO_SND_D_INPUT;
    ++    stream->info.hdr.hda_fn_nid = VIRTIO_SOUND_HDA_FN_NID;
    ++    stream->features = 0;
    ++    stream->channels_min = 1;
    ++    stream->channels_max = as.nchannels;
    ++    stream->formats = supported_formats;
    ++    stream->rates = supported_rates;
    ++    stream->s = s;
    ++
    ++    stream->buffer_bytes = params->buffer_bytes;
    ++    stream->period_bytes = params->period_bytes;
    ++
    ++    stream->positions[0] = VIRTIO_SND_CHMAP_FL;
    ++    stream->positions[1] = VIRTIO_SND_CHMAP_FR;
    ++
    ++    stream->as = as;
    ++    stream->desired_as = stream->as;
    ++    qemu_mutex_init(&stream->queue_mutex);
    ++    QSIMPLEQ_INIT(&stream->queue);
    ++
    ++    s->pcm->streams[stream_id] = stream;
    ++
    ++    return VIRTIO_SND_S_OK;
    ++}
     +
      /*
       * The actual processing done in virtio_snd_process_cmdq().
    @@ hw/virtio/virtio-snd.c: static void virtio_snd_common_realize(DeviceState *dev,
     +                       print_code(status));
     +            return;
     +        }
    ++        status = virtio_snd_pcm_prepare_impl(vsnd, i);
    ++        if (status != VIRTIO_SND_S_OK) {
    ++            error_setg(errp,
    ++                       "Can't prepare streams, device responded with %s.",
    ++                       print_code(status));
    ++            return;
    ++        }
     +    }
      }
      
      static void
    +@@ hw/virtio/virtio-snd.c: static void virtio_snd_realize(DeviceState *dev, Error **errp)
    +                               errp);
    + }
    + 
    +-/*
    +- * Close the stream and free its resources.
    +- *
    +- * @stream: VirtIOSoundPCMStream *stream
    +- */
    +-static void virtio_snd_pcm_close(VirtIOSoundPCMStream *stream)
    +-{
    +-}
    +-
    + static void virtio_snd_unrealize(DeviceState *dev)
    + {
    +     VirtIODevice *vdev = VIRTIO_DEVICE(dev);
    +@@ hw/virtio/virtio-snd.c: static void virtio_snd_unrealize(DeviceState *dev)
    +         vsnd->pcm = NULL;
    +     }
    +     AUD_remove_card(&vsnd->card);
    ++    qemu_mutex_destroy(&vsnd->cmdq_mutex);
    +     virtio_cleanup(vdev);
    + }
    + 
 5:  19d95e8411 <  -:  ---------- virtio-sound: prepare PCM streams
 6:  78777fb46f =  5:  06f676e360 virtio-sound: handle VIRTIO_SND_R_PCM_INFO request
 7:  7641e21ee8 =  6:  d3102a0850 virtio-sound: handle VIRTIO_SND_R_PCM_{START,STOP}
 8:  48f9b776f5 =  7:  0cb3e8a3b5 virtio-sound: handle VIRTIO_SND_PCM_SET_PARAMS
 9:  cdb8ab3ee2 =  8:  894b52532b virtio-sound: handle VIRTIO_SND_R_PCM_PREPARE
10:  bbc11d0348 !  9:  4aebc54222 virtio-sound: handle VIRTIO_SND_PCM_RELEASE
    @@ hw/virtio/virtio-snd.c: static void virtio_snd_handle_pcm_start_stop(VirtIOSound
      }
      
     +/*
    -+ * Releases the buffer resources allocated to a stream. Seperated from the
    -+ * handler so that the code can be reused in the unrealize function. Returns
    -+ * the response status code. (VIRTIO_SND_S_*).
    -+ *
    -+ * @stream: VirtIOSoundPCMStream stream
    -+ * @stream_id: stream id
    -+ */
    -+static uint32_t virtio_snd_pcm_release_impl(VirtIOSoundPCMStream *stream,
    -+                                            uint32_t stream_id)
    -+{
    -+    return VIRTIO_SND_S_OK;
    -+}
    -+
    -+/*
    -+ * Handles VIRTIO_SND_R_PCM_RELEASE.
    ++ * Handles VIRTIO_SND_R_PCM_RELEASE. Releases the buffer resources allocated to
    ++ * a stream.
     + *
     + * @s: VirtIOSound device
     + * @cmd: The request command queue element from VirtIOSound cmdq field
    @@ hw/virtio/virtio-snd.c: static void virtio_snd_handle_pcm_start_stop(VirtIOSound
     +        cmd->resp.code = VIRTIO_SND_S_BAD_MSG;
     +        return;
     +    }
    -+    cmd->resp.code = virtio_snd_pcm_release_impl(stream, stream_id);
    ++    cmd->resp.code = VIRTIO_SND_S_OK;
     +}
     +
      /*
11:  d5fb4b058c ! 10:  ab95cdd4ae virtio-sound: implement audio output (TX)
    @@ hw/virtio/virtio-snd.c
      static uint32_t supported_formats = BIT(VIRTIO_SND_PCM_FMT_S8)
                                        | BIT(VIRTIO_SND_PCM_FMT_U8)
                                        | BIT(VIRTIO_SND_PCM_FMT_S16)
    +@@ hw/virtio/virtio-snd.c: static void virtio_snd_get_qemu_audsettings(audsettings *as,
    +  */
    + static void virtio_snd_pcm_close(VirtIOSoundPCMStream *stream)
    + {
    ++    VirtIOSoundPCMBlock *block, *next;
    ++
    +     if (stream) {
    ++        WITH_QEMU_LOCK_GUARD(&stream->queue_mutex) {
    ++            QSIMPLEQ_FOREACH_SAFE(block, &stream->queue, entry, next) {
    ++                virtqueue_push(block->vq,
    ++                        block->elem,
    ++                        sizeof(block->elem));
    ++                virtio_notify(VIRTIO_DEVICE(stream->s),
    ++                        block->vq);
    ++                QSIMPLEQ_REMOVE_HEAD(&stream->queue, entry);
    ++                g_free(block);
    ++            }
    ++        }
    ++        if (stream->direction == VIRTIO_SND_D_OUTPUT) {
    ++            AUD_close_out(&stream->pcm->snd->card, stream->voice.out);
    ++            stream->voice.out = NULL;
    ++        }
    +         qemu_mutex_destroy(&stream->queue_mutex);
    +         g_free(stream);
    +     }
     @@ hw/virtio/virtio-snd.c: static uint32_t virtio_snd_pcm_prepare_impl(VirtIOSound *s, uint32_t stream_id)
          stream->positions[0] = VIRTIO_SND_CHMAP_FL;
          stream->positions[1] = VIRTIO_SND_CHMAP_FR;
    @@ hw/virtio/virtio-snd.c: static void virtio_snd_handle_pcm_start_stop(VirtIOSound
          }
      }
      
    -+/*
    + /*
    +- * Handles VIRTIO_SND_R_PCM_RELEASE. Releases the buffer resources allocated to
    +- * a stream.
     + * Returns the number of bytes that have not been passed to AUD_write yet.
     + *
     + * @stream: VirtIOSoundPCMStream
    @@ hw/virtio/virtio-snd.c: static void virtio_snd_handle_pcm_start_stop(VirtIOSound
     +    return size;
     +}
     +
    - /*
    -  * Releases the buffer resources allocated to a stream. Seperated from the
    -  * handler so that the code can be reused in the unrealize function. Returns
    -@@ hw/virtio/virtio-snd.c: static void virtio_snd_handle_pcm_start_stop(VirtIOSound *s,
    - static uint32_t virtio_snd_pcm_release_impl(VirtIOSoundPCMStream *stream,
    -                                             uint32_t stream_id)
    - {
    ++/*
    ++ * Handles VIRTIO_SND_R_PCM_RELEASE.
    +  *
    +  * @s: VirtIOSound device
    +  * @cmd: The request command queue element from VirtIOSound cmdq field
    +@@ hw/virtio/virtio-snd.c: static void virtio_snd_handle_pcm_release(VirtIOSound *s,
    +         cmd->resp.code = VIRTIO_SND_S_BAD_MSG;
    +         return;
    +     }
    ++
     +    if (virtio_snd_pcm_get_pending_bytes(stream)) {
     +        /*
     +         * virtio-v1.2-csd01, 5.14.6.6.5.1,
    @@ hw/virtio/virtio-snd.c: static void virtio_snd_handle_pcm_start_stop(VirtIOSound
     +        virtio_snd_pcm_flush(stream);
     +    }
     +
    -     return VIRTIO_SND_S_OK;
    +     cmd->resp.code = VIRTIO_SND_S_OK;
      }
      
     @@ hw/virtio/virtio-snd.c: static void virtio_snd_handle_event(VirtIODevice *vdev, VirtQueue *vq)
    @@ hw/virtio/virtio-snd.c: static void virtio_snd_realize(DeviceState *dev, Error *
     +    }
     +}
     +
    - /*
    -  * Close the sound card.
    -  *
    -@@ hw/virtio/virtio-snd.c: static void virtio_snd_realize(DeviceState *dev, Error **errp)
    - static void virtio_snd_pcm_close(VirtIOSoundPCMStream *stream)
    - {
    -     virtio_snd_process_cmdq(stream->s);
    -+    if (stream->direction == VIRTIO_SND_D_OUTPUT) {
    -+        AUD_close_out(&stream->pcm->snd->card, stream->voice.out);
    -+        stream->voice.out = NULL;
    -+    }
    - }
    - 
      static void virtio_snd_unrealize(DeviceState *dev)
    + {
    +     VirtIODevice *vdev = VIRTIO_DEVICE(dev);
     @@ hw/virtio/virtio-snd.c: static void virtio_snd_unrealize(DeviceState *dev)
    - 
    -     trace_virtio_snd_unrealize(vsnd);
    - 
    --    for (uint32_t i = 0; i < vsnd->snd_conf.streams; i++) {
    --        stream = vsnd->pcm->streams[i];
    --        virtio_snd_pcm_close(stream);
    --        g_free(stream);
    -+    if (vsnd->pcm) {
    -+        if (vsnd->pcm->streams) {
    -+            for (uint32_t i = 0; i < vsnd->snd_conf.streams; i++) {
    -+                stream = vsnd->pcm->streams[i];
    -+                if (stream) {
    -+                    virtio_snd_pcm_close(stream);
    -+                    g_free(stream);
    -+                }
    -+            }
    -+            g_free(vsnd->pcm->streams);
    -+            g_free(vsnd->pcm->pcm_params);
    -+            g_free(vsnd->pcm->jacks);
    -+        }
    -+
    -+        g_free(vsnd->pcm);
    +             }
    +             g_free(vsnd->pcm->streams);
    +         }
    ++        g_free(vsnd->pcm->pcm_params);
    ++        g_free(vsnd->pcm->jacks);
    +         g_free(vsnd->pcm);
    +         vsnd->pcm = NULL;
          }
    -+
    -+    vsnd->pcm = NULL;
    -     AUD_remove_card(&vsnd->card);
    --    g_free(vsnd->pcm);
    -     virtio_cleanup(vdev);
    +@@ hw/virtio/virtio-snd.c: static void virtio_snd_unrealize(DeviceState *dev)
      }
      
      
12:  e2c30e2a21 ! 11:  5e8f423499 virtio-sound: implement audio capture (RX)
    @@ hw/virtio/virtio-snd.c
      
      static uint32_t supported_formats = BIT(VIRTIO_SND_PCM_FMT_S8)
                                        | BIT(VIRTIO_SND_PCM_FMT_U8)
    +@@ hw/virtio/virtio-snd.c: static void virtio_snd_pcm_close(VirtIOSoundPCMStream *stream)
    +         if (stream->direction == VIRTIO_SND_D_OUTPUT) {
    +             AUD_close_out(&stream->pcm->snd->card, stream->voice.out);
    +             stream->voice.out = NULL;
    ++        } else if (stream->direction == VIRTIO_SND_D_INPUT) {
    ++            AUD_close_in(&stream->pcm->snd->card, stream->voice.in);
    ++            stream->voice.in = NULL;
    +         }
    +         qemu_mutex_destroy(&stream->queue_mutex);
    +         g_free(stream);
     @@ hw/virtio/virtio-snd.c: static uint32_t virtio_snd_pcm_prepare_impl(VirtIOSound *s, uint32_t stream_id)
                                               virtio_snd_pcm_out_cb,
                                               &as);
    @@ hw/virtio/virtio-snd.c: static void virtio_snd_handle_pcm_start_stop(VirtIOSound
              }
          } else {
              error_report("Invalid stream id: %"PRIu32, req.stream_id);
    -@@ hw/virtio/virtio-snd.c: static uint32_t virtio_snd_pcm_release_impl(VirtIOSoundPCMStream *stream,
    +@@ hw/virtio/virtio-snd.c: static void virtio_snd_handle_pcm_release(VirtIOSound *s,
               */
              virtio_snd_process_cmdq(stream->s);
              trace_virtio_snd_pcm_stream_flush(stream_id);
    @@ hw/virtio/virtio-snd.c: static uint32_t virtio_snd_pcm_release_impl(VirtIOSoundP
     +        }
          }
      
    -     return VIRTIO_SND_S_OK;
    +     cmd->resp.code = VIRTIO_SND_S_OK;
     @@ hw/virtio/virtio-snd.c: static void virtio_snd_handle_event(VirtIODevice *vdev, VirtQueue *vq)
       * @vdev: VirtIOSound device
       * @vq: tx virtqueue
    @@ hw/virtio/virtio-snd.c: static void virtio_snd_pcm_out_cb(void *data, int availa
     +            );
     +}
     +
    - /*
    -  * Close the sound card.
    -  *
    + static void virtio_snd_unrealize(DeviceState *dev)
    + {
    +     VirtIODevice *vdev = VIRTIO_DEVICE(dev);
     @@ hw/virtio/virtio-snd.c: static void virtio_snd_unrealize(DeviceState *dev)
      
      
 -:  ---------- > 12:  a3f2576f6a docs/system: add basic virtio-snd documentation

base-commit: 408af44d04476c633065bfb1eca6865ea93f2984
-- 
2.39.2



             reply	other threads:[~2023-08-15  9:09 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-08-15  9:07 Emmanouil Pitsidianakis [this message]
2023-08-15  9:07 ` [PATCH v6 01/12] Add virtio-sound device stub Emmanouil Pitsidianakis
2023-08-20  9:33   ` Volker Rümelin
2023-08-21  6:06     ` Manos Pitsidianakis
2023-08-21 18:52       ` Volker Rümelin
2023-08-22  8:46         ` Alex Bennée
2023-08-15  9:07 ` [PATCH v6 02/12] Add virtio-sound-pci device Emmanouil Pitsidianakis
2023-08-20  9:08   ` Volker Rümelin
2023-08-15  9:07 ` [PATCH v6 03/12] virtio-sound: handle control messages and streams Emmanouil Pitsidianakis
2023-08-15  9:07 ` [PATCH v6 04/12] virtio-sound: set PCM stream parameters Emmanouil Pitsidianakis
2023-08-15  9:07 ` [PATCH v6 05/12] virtio-sound: handle VIRTIO_SND_R_PCM_INFO request Emmanouil Pitsidianakis
2023-08-15  9:07 ` [PATCH v6 06/12] virtio-sound: handle VIRTIO_SND_R_PCM_{START,STOP} Emmanouil Pitsidianakis
2023-08-15  9:07 ` [PATCH v6 07/12] virtio-sound: handle VIRTIO_SND_PCM_SET_PARAMS Emmanouil Pitsidianakis
2023-08-15  9:07 ` [PATCH v6 08/12] virtio-sound: handle VIRTIO_SND_R_PCM_PREPARE Emmanouil Pitsidianakis
2023-08-15  9:07 ` [PATCH v6 09/12] virtio-sound: handle VIRTIO_SND_PCM_RELEASE Emmanouil Pitsidianakis
2023-08-15  9:07 ` [PATCH v6 10/12] virtio-sound: implement audio output (TX) Emmanouil Pitsidianakis
2023-08-15  9:07 ` [PATCH v6 11/12] virtio-sound: implement audio capture (RX) Emmanouil Pitsidianakis
2023-08-15 15:04   ` 林伟6
2023-08-15  9:07 ` [PATCH v6 12/12] docs/system: add basic virtio-snd documentation Emmanouil Pitsidianakis
2023-08-20 11:46 ` [PATCH v6 00/12] Add VIRTIO sound card Volker Rümelin
2023-08-21  6:10   ` Manos Pitsidianakis
2023-08-21 19:35     ` Volker Rümelin

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=cover.1692089917.git.manos.pitsidianakis@linaro.org \
    --to=manos.pitsidianakis@linaro.org \
    --cc=Anton.Yakovlev@opensynergy.com \
    --cc=DirtY.iCE.hu@gmail.com \
    --cc=Igor.Skalkin@opensynergy.com \
    --cc=alex.bennee@linaro.org \
    --cc=berrange@redhat.com \
    --cc=eduardo@habkost.net \
    --cc=kraxel@redhat.com \
    --cc=marcandre.lureau@redhat.com \
    --cc=marcel.apfelbaum@gmail.com \
    --cc=mst@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=philmd@linaro.org \
    --cc=qemu-devel@nongnu.org \
    --cc=vr_qemu@t-online.de \
    /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.