All of lore.kernel.org
 help / color / mirror / Atom feed
* paravirtualized alsa  kernel driver for XEN
@ 2012-03-19 17:15 Stefano Panella
  2012-03-20  9:52 ` David Henningsson
  2012-03-20 13:10 ` Clemens Ladisch
  0 siblings, 2 replies; 10+ messages in thread
From: Stefano Panella @ 2012-03-19 17:15 UTC (permalink / raw)
  To: alsa-devel

Hi,

I am Stefano Panella, I am new to the list and I would like to take the 
opportunity to ask some questions since I am trying to write a 
paravirtualized alsa driver for XEN.

If all goes well I would also like to upstream it on linux.

I have been reading the documentation on "Writing an ALSA Driver" and I 
am still not completely clear on the meaning of the "pointer" callback 
in the pcm operations.

The description say:

"This callback is called when the PCM middle layer inquires the current 
hardware position on the buffer."

My question are:

1) In case of a playback stream, is the pointer referring to wich sample 
is currently playing on the DAC or to which is it the last frame read by 
the HW from the alsa memory buffer?

2) What does the pointer mean in case of a capture stream? Is it the 
position of the current frame on the ADC or is the latest frame written 
into the alsa buffer?

3) in case it is the frame on the DAC/ADC, what happens if the callback 
does not return the real DAC/ADC frame position but an approximate 
value, let say rounded to 64 frames only?

4) is there any test I could run to check I have implemented correctly 
the "pointer" callback? Or any application which would need very high 
"pointer" precision like frame precision?

Thanks very much in advance,

Stefano

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: paravirtualized alsa  kernel driver for XEN
  2012-03-19 17:15 paravirtualized alsa kernel driver for XEN Stefano Panella
@ 2012-03-20  9:52 ` David Henningsson
  2012-03-21 10:11   ` Stefano Panella
  2012-03-20 13:10 ` Clemens Ladisch
  1 sibling, 1 reply; 10+ messages in thread
From: David Henningsson @ 2012-03-20  9:52 UTC (permalink / raw)
  To: Stefano Panella; +Cc: alsa-devel

On 03/19/2012 06:15 PM, Stefano Panella wrote:
> Hi,
>
> I am Stefano Panella, I am new to the list and I would like to take the
> opportunity to ask some questions since I am trying to write a
> paravirtualized alsa driver for XEN.
>
> If all goes well I would also like to upstream it on linux.
>
> I have been reading the documentation on "Writing an ALSA Driver" and I
> am still not completely clear on the meaning of the "pointer" callback
> in the pcm operations.
>
> The description say:
>
> "This callback is called when the PCM middle layer inquires the current
> hardware position on the buffer."
>
> My question are:
>
> 1) In case of a playback stream, is the pointer referring to wich sample
> is currently playing on the DAC or to which is it the last frame read by
> the HW from the alsa memory buffer?
>
> 2) What does the pointer mean in case of a capture stream? Is it the
> position of the current frame on the ADC or is the latest frame written
> into the alsa buffer?

I'd say that for both, it is being used by applications to know what 
memory they can read from or write to. But other people here might know 
better.

> 3) in case it is the frame on the DAC/ADC, what happens if the callback
> does not return the real DAC/ADC frame position but an approximate
> value, let say rounded to 64 frames only?

For the JACK sound server, I think it only needs to be as accurate as 
the period (i e if you have 4 periods with 64 samples each, you need to 
be able to return 0, 64, 128 and 192).

For PulseAudio it's worse. The worse granularity, the more difficult for 
PulseAudio to have low-latency operation. PulseAudio also 
rewinds/rewrites the buffer occasionally and uses the pointer to know 
from when it should start rewriting.

> 4) is there any test I could run to check I have implemented correctly
> the "pointer" callback? Or any application which would need very high
> "pointer" precision like frame precision?

PulseAudio has an alsa-time-test application that relies heavily on the 
pointer callback being accurate. It's only for playback and I've never 
used it myself so I'm not completely sure about how to interpret the 
numbers.

In general, I believe PulseAudio (especially with timer-scheduling mode 
enabled) stress tests the driver quite hard and as such it is sometimes 
being used as a measure to see if the audio driver is successful. :-)

Hopefully this provides some initial insights.

-- 
David Henningsson, Canonical Ltd.
http://launchpad.net/~diwic

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: paravirtualized alsa kernel driver for XEN
  2012-03-19 17:15 paravirtualized alsa kernel driver for XEN Stefano Panella
  2012-03-20  9:52 ` David Henningsson
@ 2012-03-20 13:10 ` Clemens Ladisch
  2012-03-21 10:16   ` Stefano Panella
  1 sibling, 1 reply; 10+ messages in thread
From: Clemens Ladisch @ 2012-03-20 13:10 UTC (permalink / raw)
  To: Stefano Panella; +Cc: alsa-devel

Stefano Panella wrote:
> I have been reading the documentation on "Writing an ALSA Driver" and I
> am still not completely clear on the meaning of the "pointer" callback
> in the pcm operations.
>
> 1) In case of a playback stream, is the pointer referring to wich sample
> is currently playing on the DAC or to which is it the last frame read by
> the HW from the alsa memory buffer?

It's the position of the first frame not yet read from the memory buffer.

The delay between the DMA and the DAC output would be reported by
adjusting runtime->delay, but drivers usually do not bother to do this,
except when this delay becomes rather large because of additional
queueing, e.g., in the USB driver.

> 4) is there any test I could run to check I have implemented correctly
> the "pointer" callback? Or any application which would need very high
> "pointer" precision like frame precision?

PulseAudio.
Or run mplayer and look at the A-V value in the status line.


Regards,
Clemens

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: paravirtualized alsa  kernel driver for XEN
  2012-03-20  9:52 ` David Henningsson
@ 2012-03-21 10:11   ` Stefano Panella
  0 siblings, 0 replies; 10+ messages in thread
From: Stefano Panella @ 2012-03-21 10:11 UTC (permalink / raw)
  To: David Henningsson; +Cc: alsa-devel

Hi,

Thanks very much for your quick, detailed and useful response.

On 20/03/12 09:52, David Henningsson wrote:
> On 03/19/2012 06:15 PM, Stefano Panella wrote:
>> Hi,
>>
>> I am Stefano Panella, I am new to the list and I would like to take the
>> opportunity to ask some questions since I am trying to write a
>> paravirtualized alsa driver for XEN.
>>
>> If all goes well I would also like to upstream it on linux.
>>
>> I have been reading the documentation on "Writing an ALSA Driver" and I
>> am still not completely clear on the meaning of the "pointer" callback
>> in the pcm operations.
>>
>> The description say:
>>
>> "This callback is called when the PCM middle layer inquires the current
>> hardware position on the buffer."
>>
>> My question are:
>>
>> 1) In case of a playback stream, is the pointer referring to wich sample
>> is currently playing on the DAC or to which is it the last frame read by
>> the HW from the alsa memory buffer?
>>
>> 2) What does the pointer mean in case of a capture stream? Is it the
>> position of the current frame on the ADC or is the latest frame written
>> into the alsa buffer?
>
> I'd say that for both, it is being used by applications to know what
> memory they can read from or write to. But other people here might know
> better.
>
>> 3) in case it is the frame on the DAC/ADC, what happens if the callback
>> does not return the real DAC/ADC frame position but an approximate
>> value, let say rounded to 64 frames only?
>
> For the JACK sound server, I think it only needs to be as accurate as
> the period (i e if you have 4 periods with 64 samples each, you need to
> be able to return 0, 64, 128 and 192).
>
> For PulseAudio it's worse. The worse granularity, the more difficult for
> PulseAudio to have low-latency operation. PulseAudio also
> rewinds/rewrites the buffer occasionally and uses the pointer to know
> from when it should start rewriting.
>
>> 4) is there any test I could run to check I have implemented correctly
>> the "pointer" callback? Or any application which would need very high
>> "pointer" precision like frame precision?
>
> PulseAudio has an alsa-time-test application that relies heavily on the
> pointer callback being accurate. It's only for playback and I've never
> used it myself so I'm not completely sure about how to interpret the
> numbers.
I will try this for sure.
>
> In general, I believe PulseAudio (especially with timer-scheduling mode
> enabled) stress tests the driver quite hard and as such it is sometimes
> being used as a measure to see if the audio driver is successful. :-)
>
> Hopefully this provides some initial insights.
Yes
>

I will let you know how this work is progressing

Thanks again,

Stefano

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: paravirtualized alsa kernel driver for XEN
  2012-03-20 13:10 ` Clemens Ladisch
@ 2012-03-21 10:16   ` Stefano Panella
  2012-03-21 13:37     ` Clemens Ladisch
  0 siblings, 1 reply; 10+ messages in thread
From: Stefano Panella @ 2012-03-21 10:16 UTC (permalink / raw)
  To: Clemens Ladisch; +Cc: alsa-devel

Hi,

Thanks for taking the time to answer about this detail.

On 20/03/12 13:10, Clemens Ladisch wrote:
> Stefano Panella wrote:
>> I have been reading the documentation on "Writing an ALSA Driver" and I
>> am still not completely clear on the meaning of the "pointer" callback
>> in the pcm operations.
>>
>> 1) In case of a playback stream, is the pointer referring to wich sample
>> is currently playing on the DAC or to which is it the last frame read by
>> the HW from the alsa memory buffer?
>
> It's the position of the first frame not yet read from the memory buffer.
>
> The delay between the DMA and the DAC output would be reported by
> adjusting runtime->delay, but drivers usually do not bother to do this,
> except when this delay becomes rather large because of additional
> queueing, e.g., in the USB driver.
>
ok, I was wondering about applications like skype, trying to do some 
background noise cancellation, or to eliminate echo when using speakers.
I was thinking in this case the delay should be accurate for Playback 
and Capture as well, or am I wrong?
>> 4) is there any test I could run to check I have implemented correctly
>> the "pointer" callback? Or any application which would need very high
>> "pointer" precision like frame precision?
>
> PulseAudio.
> Or run mplayer and look at the A-V value in the status line.
>
I will try these as well.
>
> Regards,
> Clemens

In case this pv XEN alsa driver will start to work properly, where 
should I post the patches? Who is currently the linux kernel alsa driver 
mantainer?

Thanks again,

Stefano.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: paravirtualized alsa kernel driver for XEN
  2012-03-21 10:16   ` Stefano Panella
@ 2012-03-21 13:37     ` Clemens Ladisch
  2012-03-22 11:22       ` Stefano Panella
  0 siblings, 1 reply; 10+ messages in thread
From: Clemens Ladisch @ 2012-03-21 13:37 UTC (permalink / raw)
  To: Stefano Panella; +Cc: alsa-devel

Stefano Panella wrote:
> On 20/03/12 13:10, Clemens Ladisch wrote:
> > The delay between the DMA and the DAC output would be reported by
> > adjusting runtime->delay, but drivers usually do not bother to do this,
> > except when this delay becomes rather large because of additional
> > queueing, e.g., in the USB driver.
>
> ok, I was wondering about applications like skype, trying to do some
> background noise cancellation, or to eliminate echo when using speakers.
> I was thinking in this case the delay should be accurate for Playback
> and Capture as well, or am I wrong?

If the sound data is regularly moved from the VM's buffer to the host's
buffer, then the additional latency of the host is big enough that it's
worth reporting.

If you map the host's buffer into the VM's address space, there is no
additional latency, but I don't know if this is feasible.  If not, you
could also use the pcm_ops.copy callback to copy the data from the VM
to the host as soon as the application writes it.

> Who is currently the linux kernel alsa driver mantainer?

See "SOUND" in the MAINTAINERS file.


Regards,
Clemens

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: paravirtualized alsa kernel driver for XEN
  2012-03-21 13:37     ` Clemens Ladisch
@ 2012-03-22 11:22       ` Stefano Panella
  2012-03-22 12:09         ` Clemens Ladisch
  0 siblings, 1 reply; 10+ messages in thread
From: Stefano Panella @ 2012-03-22 11:22 UTC (permalink / raw)
  To: Clemens Ladisch; +Cc: alsa-devel

On 21/03/12 13:37, Clemens Ladisch wrote:
> Stefano Panella wrote:
>> On 20/03/12 13:10, Clemens Ladisch wrote:
>>> The delay between the DMA and the DAC output would be reported by
>>> adjusting runtime->delay, but drivers usually do not bother to do this,
>>> except when this delay becomes rather large because of additional
>>> queueing, e.g., in the USB driver.
>>
>> ok, I was wondering about applications like skype, trying to do some
>> background noise cancellation, or to eliminate echo when using speakers.
>> I was thinking in this case the delay should be accurate for Playback
>> and Capture as well, or am I wrong?
>
> If the sound data is regularly moved from the VM's buffer to the host's
> buffer, then the additional latency of the host is big enough that it's
> worth reporting.
>
> If you map the host's buffer into the VM's address space, there is no
> additional latency, but I don't know if this is feasible.  If not, you
> could also use the pcm_ops.copy callback to copy the data from the VM
> to the host as soon as the application writes it.
>
My PV alsa driver is allocating some non contiguous pages for the audio 
buffer and the get_page callback is called to retrieve the position of 
every page. These pages are also mapped from the backend in dom0.

The backend in dom0 is a userspace process using portaudio on top of alsa.
The process is running in realtime priority and is calling a callback to 
feed data every 64 frames.
In the callback I copy 64 frames from the shared pages to the portaudio 
buffer and update the HW pointer in an other shared page accordingly.

Would it be possible to run the backend in dom0 kernel space and to use 
my shared pages from the alsa-driver in the VM as real pages for the HW 
instead to go all the way from 
userspace->portaudio->alsalib->alsa-kernel-layer->Real-HW ?

>> Who is currently the linux kernel alsa driver mantainer?
>
> See "SOUND" in the MAINTAINERS file.
OK
>
>
> Regards,
> Clemens

Thanks again very much and regards,

Stefano

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: paravirtualized alsa kernel driver for XEN
  2012-03-22 11:22       ` Stefano Panella
@ 2012-03-22 12:09         ` Clemens Ladisch
  2012-04-11 17:08           ` Stefano Panella
  0 siblings, 1 reply; 10+ messages in thread
From: Clemens Ladisch @ 2012-03-22 12:09 UTC (permalink / raw)
  To: Stefano Panella; +Cc: alsa-devel

Stefano Panella wrote:
> The backend in dom0 is a userspace process using portaudio on top of alsa.
> The process is running in realtime priority and is calling a callback to
> feed data every 64 frames.
> In the callback I copy 64 frames from the shared pages to the portaudio
> buffer and update the HW pointer in an other shared page accordingly.

If PortAudio requires to use a callback, this is the only algorithm
that you can implement.

> Would it be possible to run the backend in dom0 kernel space and to use
> my shared pages from the alsa-driver in the VM as real pages for the HW?

No, the buffer pages are always under the control of and allocated by
the actual driver (some devices might have special requirements, or do
not support mmap at all).

If the actual driver support mmap, you would have to map these dom0
pages into the VM, and I guess this is not possible. (?)


As far as I can see, you have two options:

1) Stay with the current algorithm.  You get an additional latency
   corresponding to dom0's buffer size, and your process is forced to
   wake up every 64 frames (or whatever PortAudio is configured for).

2) Replace PortAudio with ALSA in the backend, and implement the copy
   callback in your driver.  Any call of snd_pcm_write*() in the VM will
   result in one or more calls to your driver's copy(), which should end
   up as a call to snd_pcm_write*() in dom0.  (Using the copy callback
   also implies that the driver does not support mmap.)


Regards,
Clemens

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: paravirtualized alsa kernel driver for XEN
  2012-03-22 12:09         ` Clemens Ladisch
@ 2012-04-11 17:08           ` Stefano Panella
  2012-04-11 18:41             ` Clemens Ladisch
  0 siblings, 1 reply; 10+ messages in thread
From: Stefano Panella @ 2012-04-11 17:08 UTC (permalink / raw)
  To: Clemens Ladisch; +Cc: alsa-devel

Hi,

On 22/03/12 12:09, Clemens Ladisch wrote:
> Stefano Panella wrote:
>> The backend in dom0 is a userspace process using portaudio on top of alsa.
>> The process is running in realtime priority and is calling a callback to
>> feed data every 64 frames.
>> In the callback I copy 64 frames from the shared pages to the portaudio
>> buffer and update the HW pointer in an other shared page accordingly.
>
> If PortAudio requires to use a callback, this is the only algorithm
> that you can implement.
>
>> Would it be possible to run the backend in dom0 kernel space and to use
>> my shared pages from the alsa-driver in the VM as real pages for the HW?
>
> No, the buffer pages are always under the control of and allocated by
> the actual driver (some devices might have special requirements, or do
> not support mmap at all).
>
> If the actual driver support mmap, you would have to map these dom0
> pages into the VM, and I guess this is not possible. (?)
>
>
> As far as I can see, you have two options:
>
> 1) Stay with the current algorithm.  You get an additional latency
>     corresponding to dom0's buffer size, and your process is forced to
>     wake up every 64 frames (or whatever PortAudio is configured for).
>
> 2) Replace PortAudio with ALSA in the backend, and implement the copy
>     callback in your driver.  Any call of snd_pcm_write*() in the VM will
>     result in one or more calls to your driver's copy(), which should end
>     up as a call to snd_pcm_write*() in dom0.  (Using the copy callback
>     also implies that the driver does not support mmap.)
>
>
I am now switching to write the backend using alsa + dmix + dsnoop 
directley since I did not manage to get information about precise timing 
in .

I would like echo cancellation to work in the guest but I am getting a 
bit lost and I am not certain anymore which would be the best approch.

I have available for sure:

1) a set of shared pages, used for:
- playback buffer
- capture buffer
- general purpose commands/events/flags

2) a way to send notification from the backend resulting in an interrupt 
in the guest pv alsa kernel driver.
- I use it at the moment to send a period interrupt

3) a way to have a callback executed in the backend code triggered from 
the guest alsa driver, like as I use for:
-prepare
-trigger
-open
-close

My question is now:

To make echo cancellation work in the guest the guest needs to know 
exactly which sample in the buffer is going in and out, right?

How can I design my alsa backend userspace program and the pv alsa 
kernel driver for the guest to do this?

Is there any echo cancellation test program to check pv alsa driver in 
the guest + backend alsa app in dom0 are working well without douing a 
skype call every time?

What would be very critical in the guest pv alsa driver?
- Should the first audio sample be played/captured right after the 
trigger or it can happen at later time (runtime->delay maybe could be 
setted)?
- should the pointer callback reflect the sample being currently 
played/captured?
- what should the pointer callback return in case of a fixed delay in 
playback and capture?
- do I need an interrupt every period triggered from the backend or can 
I use the hrtimer as in the dummy sound card example?
-in order to only use the copy callback, and remove mmap support, what 
should I do?


On the backend application side:
- how using dmix, dsnoop, asym plugins affects sample position accuracy 
using snd_pcm_delay, snd_pcm_avail, snd_pcm_status_get_delay ?
- how could I be woken up exactly every period using dmix, dsnoop, asym 
plugins?

Sorry for these many questions but I have been doing experiments so far 
and all is working well but echo cancellation and I would like to know 
if I completely misunderstood something.

Thanks for all your patience,

Regards,

Stefano

> Regards,
> Clemens

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: paravirtualized alsa kernel driver for XEN
  2012-04-11 17:08           ` Stefano Panella
@ 2012-04-11 18:41             ` Clemens Ladisch
  0 siblings, 0 replies; 10+ messages in thread
From: Clemens Ladisch @ 2012-04-11 18:41 UTC (permalink / raw)
  To: Stefano Panella; +Cc: alsa-devel

Stefano Panella wrote:
> To make echo cancellation work in the guest the guest needs to know
> exactly which sample in the buffer is going in and out, right?

Yes.  (Although many drivers don't bother to report the delay, and Skype
works anyway, but that's probably because the delay isn't too big anyway.)

> How can I design my alsa backend userspace program and the pv alsa
> kernel driver for the guest to do this?

Report the correct delay, i.e., in the pv pointer callback, call
snd_pcm_status() in the backend to get both DMA position and delay, and
compute from these the delay to set in runtime->delay.

(Well, I don't know if Skype actually uses the delay value ...)

> Is there any echo cancellation test program

None that I know of.

> What would be very critical in the guest pv alsa driver?
> - Should the first audio sample be played/captured right after the
>   trigger or it can happen at later time

In your pv trigger callback, you should ultimately call the backend
trigger, i.e., snd_pcm_start() etc.

How fast the first sample is played depends on the host sound driver
(and the latency of your pv->dom0 call).

> (runtime->delay maybe could be setted)?

You do not know if there is a constant delay or if it can change (as
with, e.g., the USB driver), so you should recompute the delay in the
pointer callback.

> - should the pointer callback reflect the sample being currently
>   played/captured?

No, it's the DMA position, i.e., the position in the buffer where the
application can read or write data.

> - what should the pointer callback return in case of a fixed delay in
>   playback and capture?

The callback's return value doesn't depend on the delay.  However, if
the delay changes, it must adjust runtime->delay.

> - do I need an interrupt every period triggered from the backend or
>   can I use the hrtimer as in the dummy sound card example?

The interrupts (i.e., the snd_pcm_period_elapsed() calls) must be
synchronized with the sample clock.  A period trigger is a guarantee
from the driver to the ALSA framework that
1) (at least) one period has elapsed since the last call, and
2) all the data in the period has been played, so the application
   can overwrite it with new data (i.e., the return value of the
   pointer callback is now at least at the end of the period).

The dummy driver uses a timer because there is no other clock, and what
is in the buffer doesn't actually matter for it.

You must ensure that a period_elapsed call in the pv driver does not
happen earlier than the corresponding period interrupt in the backend;
the easiest way to do this would be to connect them.

> -in order to only use the copy callback, and remove mmap support, what
> should I do?

Er, implement the copy callback (copy the indicated data from userspace
into the shared buffer, or the other way around), and drop the
SNDRV_PCM_INFO_MMAP* flags.  And you don't need to allocate a buffer in
the pv driver.

> On the backend application side:
> - how using dmix, dsnoop, asym plugins affects sample position
>   accuracy using snd_pcm_delay, snd_pcm_avail, snd_pcm_status_get_delay ?

The asym plugin just instantiates another plugin.

The dmix and dsnoop plugins just pass through snd_pcm_avail, but AFAICS
they do not report the delay at all.

> - how could I be woken up exactly every period using dmix, dsnoop,
>   asym plugins?

The dmix/dsnoop plugins get their interrupts from the base device; they
are woken up normally like any other type of device.

> all is working well but echo cancellation

Try with hw instead of dmix.  If that works, it would imply that echo
cancellation does not work with an unvirtualized dmix either, but I
don't know what device Skype actually opens.


Regards,
Clemens

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2012-04-11 18:41 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-03-19 17:15 paravirtualized alsa kernel driver for XEN Stefano Panella
2012-03-20  9:52 ` David Henningsson
2012-03-21 10:11   ` Stefano Panella
2012-03-20 13:10 ` Clemens Ladisch
2012-03-21 10:16   ` Stefano Panella
2012-03-21 13:37     ` Clemens Ladisch
2012-03-22 11:22       ` Stefano Panella
2012-03-22 12:09         ` Clemens Ladisch
2012-04-11 17:08           ` Stefano Panella
2012-04-11 18:41             ` Clemens Ladisch

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.