[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]
Subject: Re: [virtio-dev] Request for a new device number for a virtio-audio device.
On Thu, May 02, 2019 at 01:18:40PM +0200, Marco Martinelli - 13Byte srl wrote:
> 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.
Thanks. Some random thoughts (not strong opinions) below:
>
> 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.
This does not offer a way to enumerate supported configurations. The
other side blindly suggests a configuration which may or may not be
accepted.
Enumeration of sample rates, channel topologies, sample formats, etc
would allow for negotiation that works the first time and instead of
guessing a configuration that ends up being rejected by the other side.
> 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
This is also what I'd imagine.
>
> 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.
Okay, it sounds like an audio API-level interface, not lower-level like
what the USB Audio Device Class does. I'm not sure if we lose any
important functionality by choosing a high level interface.
How would soundcards with multiple inputs work? Is each input
represented as a separate virtio-audio device? The alternative is to
use an arbitrary number of mono or stereo channel pairs...
Stefan
Attachment:
signature.asc
Description: PGP signature
[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]