All of lore.kernel.org
 help / color / mirror / Atom feed
From: Marco Martinelli - 13Byte srl <marco@13byte.com>
To: Stefan Hajnoczi <stefanha@redhat.com>
Cc: virtio-dev@lists.oasis-open.org, kraxel@redhat.com
Subject: Re: [virtio-dev] Request for a new device number for a virtio-audio device.
Date: Thu, 2 May 2019 13:18:40 +0200	[thread overview]
Message-ID: <c74aebe9-5db4-902f-ef0b-f0a786806acd@13byte.com> (raw)
In-Reply-To: <20190501170525.GB22391@stefanha-x1.localdomain>

Il 01/05/19 19:05, Stefan Hajnoczi ha scritto:

> On Mon, Apr 29, 2019 at 07:39:17PM +0200, Marco Martinelli - 13Byte srl wrote:
>> Il 29/04/19 15:47, Stefan Hajnoczi ha scritto:
>>> On Mon, Apr 29, 2019 at 12:22:41AM +0200, Marco Martinelli - 13Byte srl wrote:
>>>> I'm not sure how this works, is that number already assigned and I should
>>>> use that or should I get a new one?
>>>>
>>>> For last, I have a question to clear the things up for me. It is my
>>>> understanding that in this mailing list you discuss about the
>>>> specifications, not the actual code. What's the usual process when writing a
>>>> new virtio device?
>>>> Should I start with writing the code and then document how it works or is it
>>>> the opposite? Should I document it and have it approved and then implement
>>>> the specifications?
>>>>
>>>> I know that this may sound like a stupid question, but please be patient
>>>> with me, it's my first time.
>>> I suggest posting a draft specification for the new device type before
>>> investing too much time in the implementation.
>>>
>>> Then work on the code while the spec discussion is ongoing.  This way
>>> you won't have to wait too long before implementation but you also won't
>>> find that reviewers are asking for large changes after you completed
>>> your work.
>> I feared that would be the answer.
>> As I stated I'm not familiar with most of the technologies involved. I don't
>> know if I have the capabilities to write a draft of the specifications
>> without first working on some code to clear things up.
>> I'll try my best.
> I'm happy to help you get started.
>
> I have a basic understanding of sound cards (mostly from an audio API
> and application perspective) and can explain the virtio device model.
>
> Please post the requirements and scope of the device you'd like to
> create.  Are you thinking of something general-purpose like the USB
> Audio Device Class specification, which can handle many different types
> of devices.  Or were you thinking of something more limited?
>
> In terms of virtio concepts, audio streams would be transferred in
> chunks over virtqueues.  A "control" virtqueue might be necessary to
> configure the device.  It would process configuration request/response
> packets.
>
> Stefan

Hi Stefan,

thank you for your offer.

I'll explain what I have in mind.

The scope of my project is to transfer a multichannel PCM stream from 
the VM to the host and another the other way.

The VM will see this transport interface like a generic soundcard with 
configurable input / output.

Both windows and alsa work with PCM internally and it's not a problem to 
feed the stream of one to the other, keeping in mind that channel 
mapping may vary.
I'm not aware of systems where PCM isn't used, I don't expect problems 
with this.

In Scream ( https://github.com/duncanthrax/scream ) I've used IVSHMEM as 
a ring buffer. That worked very well, it reduced the latency and 
improved the performances quite a bit over the original network 
protocol, but it's one way only (windows VM to linux host) and not as 
fast as it can be with virtio I think.

My idea is to have a device configuration layout where both the host and 
the guest can expose their current audio configuration, more or less 
like this.

struct virtio_audio_config {
         le32 sample_rate;      //from 8000Hz up to 192000Hz
         le8  sample_size;      //8bit, 16bit, 32bit or floating point
         le8  channels;         //from 1 (mono) up to 8 (7.1 surround) 
or even more in theory (eg. Dolby Atmos, 64 channels, or MAudio 1010, 
20+ channels)
         le8  channel_map[...]; //it's a list of constants to identify 
the channel order in the PCM stream (eg. CH_LEFT, CH_RIGHT, CH_CENTER)
};

The struct will be double, one from audio out, one for audio in. When 
the host or the guest change it's configuration its struct should be 
updated and the other side notified.

If the other side can't handle the configuration I'd like to figure out 
a graceful fallback. I have a few ideas in mind but I want to do some 
tests first.

If the host or the guest don't support audio out they can write 0 as 
number of channel, or zero out the entire struct during device 
initialization.
If they don't support audio input

I imagine two separate virtqueues, one for the output stream, another 
for the input stream.

What I want to do in the end consist in a few modules:
- virtio-audio specifications
- a new QEMU device based on the specs
- Windows driver for guest, based on MSVAD sample driver or SYSVAD 
sample driver, both released under MS-PL (I'll have to figure out how to 
have them signed and distributed, is MS-PL a problem?)
- ALSA driver for linux guest

Maybe I'll focus more on audio output at first and audio input later, 
because that's the common use case.

This weekend I'll take the time to document this better.

If you have any question or I was not clear let me know.


Marco


---------------------------------------------------------------------
To unsubscribe, e-mail: virtio-dev-unsubscribe@lists.oasis-open.org
For additional commands, e-mail: virtio-dev-help@lists.oasis-open.org


  reply	other threads:[~2019-05-03 17:54 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-04-28 22:22 [virtio-dev] Request for a new device number for a virtio-audio device Marco Martinelli - 13Byte srl
2019-04-29 13:47 ` Stefan Hajnoczi
2019-04-29 17:39   ` Marco Martinelli - 13Byte srl
2019-04-30 12:55     ` Michael S. Tsirkin
2019-04-30 13:56       ` Marco Martinelli - 13Byte srl
2019-04-30 14:00         ` Michael S. Tsirkin
2019-05-01 17:05     ` Stefan Hajnoczi
2019-05-02 11:18       ` Marco Martinelli - 13Byte srl [this message]
2019-05-03 16:45         ` Stefan Hajnoczi
2019-05-03 19:52           ` Marco Martinelli - 13Byte srl
2019-05-06  5:27             ` Gerd Hoffmann
2019-05-09 10:10               ` Marco Martinelli - 13Byte srl
2019-05-09 12:27                 ` Gerd Hoffmann
2019-05-10  9:45                   ` Mikhail Golubev
2019-05-10 12:16                     ` Gerd Hoffmann
2019-05-10 14:15                       ` Anton Yakovlev
2019-05-10 15:48                         ` Stefan Hajnoczi
2019-05-10 17:13                           ` Anton Yakovlev
2019-05-11 20:49                             ` Marco Martinelli - 13Byte srl
2019-05-12 20:01                               ` Matti Moell
2019-05-14 13:44                             ` Stefan Hajnoczi
2019-05-15  6:30                               ` Anton Yakovlev
2019-05-15  8:31                                 ` Anton Yakovlev
2019-05-15 16:03                                 ` Stefan Hajnoczi
2019-05-15 16:33                                   ` Anton Yakovlev
2019-05-16 10:24                                     ` Stefan Hajnoczi
2019-05-13  9:32                         ` Gerd Hoffmann
2019-05-14 19:14                           ` Anton Yakovlev
2019-05-10 10:34                   ` Stefan Hajnoczi

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=c74aebe9-5db4-902f-ef0b-f0a786806acd@13byte.com \
    --to=marco@13byte.com \
    --cc=kraxel@redhat.com \
    --cc=stefanha@redhat.com \
    --cc=virtio-dev@lists.oasis-open.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.