On Tue, Jul 25, 2023 at 06:29:58PM +0400, Marc-André Lureau wrote: > > > On Thu, Jul 20, 2023 at 4:59 PM Emmanouil Pitsidianakis < > manos.pitsidiana...@linaro.org> wrote: > > Respond to the VIRTIO_SND_R_PCM_INFO control request with the parameters > of each requested PCM stream. > > Signed-off-by: Emmanouil Pitsidianakis <manos.pitsidiana...@linaro.org> > --- > hw/virtio/trace-events | 1 + > hw/virtio/virtio-snd.c | 78 ++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 79 insertions(+) > > diff --git a/hw/virtio/trace-events b/hw/virtio/trace-events > index 8a223e36e9..3e619f778b 100644 > --- a/hw/virtio/trace-events > +++ b/hw/virtio/trace-events > @@ -164,6 +164,7 @@ virtio_snd_vm_state_stopped(void) "vm state stopped" > virtio_snd_realize(void *snd) "snd %p: realize" > virtio_snd_unrealize(void *snd) "snd %p: unrealize" > virtio_snd_handle_ctrl(void *vdev, void *vq) "snd %p: handle ctrl event > for queue %p" > +virtio_snd_handle_pcm_info(uint32_t stream) "VIRTIO_SND_R_PCM_INFO called > for stream %"PRIu32 > virtio_snd_handle_code(uint32_t val, const char *code) "ctrl code msg val > = %"PRIu32" == %s" > virtio_snd_handle_chmap_info(void) "VIRTIO_SND_CHMAP_INFO called" > virtio_snd_handle_event(void) "event queue callback called" > diff --git a/hw/virtio/virtio-snd.c b/hw/virtio/virtio-snd.c > index ca09c937c7..3f8b46f372 100644 > --- a/hw/virtio/virtio-snd.c > +++ b/hw/virtio/virtio-snd.c > @@ -134,6 +134,19 @@ virtio_snd_set_config(VirtIODevice *vdev, const > uint8_t *config) > memcpy(&s->snd_conf, sndconfig, sizeof(s->snd_conf)); > } > > +/* > + * Get a specific stream from the virtio sound card device. > + * Returns NULL if @stream_id is invalid or not allocated. > + * > + * @s: VirtIOSound device > + * @stream_id: stream id > + */ > +static VirtIOSoundPCMStream *virtio_snd_pcm_get_stream(VirtIOSound *s, > + uint32_t > stream_id) > +{ > + return stream_id >= s->snd_conf.streams ? NULL : s->pcm->streams > [stream_id]; > +} > + > /* > * Get params for a specific stream. > * > @@ -147,6 +160,69 @@ static VirtIOSoundPCMParams > *virtio_snd_pcm_get_params > (VirtIOSound *s, > : s->pcm->pcm_params[stream_id]; > } > > +/* > + * Handle the VIRTIO_SND_R_PCM_INFO request. > + * The function writes the info structs to the request element. > + * > + * @s: VirtIOSound device > + * @cmd: The request command queue element from VirtIOSound cmdq field > + */ > +static void virtio_snd_handle_pcm_info(VirtIOSound *s, > + virtio_snd_ctrl_command *cmd) > +{ > + virtio_snd_query_info req; > + VirtIOSoundPCMStream *stream = NULL; > + g_autofree virtio_snd_pcm_info *pcm_info = NULL; > + size_t sz = iov_to_buf(cmd->elem->out_sg, > + cmd->elem->out_num, > + 0, > + &req, > + sizeof(req)); > + if (sz != sizeof(virtio_snd_query_info)) { > + cmd->resp.code = VIRTIO_SND_S_BAD_MSG; > + return; > + } > + > + if (iov_size(cmd->elem->in_sg, cmd->elem->in_num) < > + sizeof(virtio_snd_hdr) + req.size * req.count) { > + error_report("pcm info: buffer too small, got: %lu, needed: %lu", > + iov_size(cmd->elem->in_sg, cmd->elem->in_num), > > > > + sizeof(virtio_snd_pcm_info)); > + cmd->resp.code = VIRTIO_SND_S_BAD_MSG; > + return; > + } > + > + pcm_info = g_new0(virtio_snd_pcm_info, req.count); > + for (uint32_t i = req.start_id; i < req.start_id + req.count; i++) { > + trace_virtio_snd_handle_pcm_info(i); > + stream = virtio_snd_pcm_get_stream(s, i); > + > + if (!stream) { > + error_report("Invalid stream id: %"PRIu32, i); > + cmd->resp.code = VIRTIO_SND_S_BAD_MSG; > + return; > + } > + > + pcm_info[i - req.start_id].hdr.hda_fn_nid = stream-> > info.hdr.hda_fn_nid; > + pcm_info[i - req.start_id].features = stream->features; > + pcm_info[i - req.start_id].formats = stream->formats; > + pcm_info[i - req.start_id].rates = stream->rates; > + pcm_info[i - req.start_id].direction = stream->direction; > + pcm_info[i - req.start_id].channels_min = stream->channels_min; > + pcm_info[i - req.start_id].channels_max = stream->channels_max; > + > + memset(&pcm_info[i].padding, 0, sizeof(pcm_info[i].padding)); > + } > + > + cmd->resp.code = VIRTIO_SND_S_OK; > + > + iov_from_buf(cmd->elem->in_sg, > + cmd->elem->in_num, > + sizeof(virtio_snd_hdr), > + pcm_info, > + sizeof(virtio_snd_pcm_info) * req.count); > +} > + > /* > * Set the given stream params. > * Called by both virtio_snd_handle_pcm_set_params and during device > @@ -358,6 +434,8 @@ process_cmd(VirtIOSound *s, virtio_snd_ctrl_command > *cmd) > cmd->resp.code = VIRTIO_SND_S_NOT_SUPP; > break; > case VIRTIO_SND_R_PCM_INFO: > + virtio_snd_handle_pcm_info(s, cmd); > + break; > case VIRTIO_SND_R_PCM_SET_PARAMS: > case VIRTIO_SND_R_PCM_PREPARE: > case VIRTIO_SND_R_PCM_START: > -- > 2.39.2 > > >
Marc-André can you please stop with trying to use gmail web client? Look here to see how it corrupts text by wrapping lines: https://lore.kernel.org/all/CAJ+F1C+H+82cA=mhpju-2nxRSA3BWnWJmp4-pi+G=lsri0o...@mail.gmail.com/ And please cut out irrelevant parts of message - I've no idea what you tried to say here. -- MST