diff mbox

pcm: Fix snd_pcm_avail_update description

Message ID 1414411902-5335-1-git-send-email-david.henningsson@canonical.com (mailing list archive)
State Rejected
Delegated to: Takashi Iwai
Headers show

Commit Message

David Henningsson Oct. 27, 2014, 12:11 p.m. UTC
While reading alsa-lib code, I discovered that snd_pcm_avail_update
does require a user-kernel context switch:

snd_pcm_avail_update() -> snd_pcm_hw_avail_update() -> sync_ptr()
-> sync_ptr1() -> ioctl()

The documentation says it does not, so let's fix the documentation.

Signed-off-by: David Henningsson <david.henningsson@canonical.com>
---
 src/pcm/pcm.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

Comments

Takashi Iwai Oct. 27, 2014, 12:17 p.m. UTC | #1
At Mon, 27 Oct 2014 13:11:42 +0100,
David Henningsson wrote:
> 
> While reading alsa-lib code, I discovered that snd_pcm_avail_update
> does require a user-kernel context switch:

Not "does" but "may"...

> snd_pcm_avail_update() -> snd_pcm_hw_avail_update() -> sync_ptr()
> -> sync_ptr1() -> ioctl()

... since this depends on the setup.  sync_ptr() calls sync_ptr1()
only when the status mmap isn't done.


Takashi

> The documentation says it does not, so let's fix the documentation.
> 
> Signed-off-by: David Henningsson <david.henningsson@canonical.com>
> ---
>  src/pcm/pcm.c | 8 +++++---
>  1 file changed, 5 insertions(+), 3 deletions(-)
> 
> diff --git a/src/pcm/pcm.c b/src/pcm/pcm.c
> index 4a7be6c..e57e362 100644
> --- a/src/pcm/pcm.c
> +++ b/src/pcm/pcm.c
> @@ -403,10 +403,12 @@ The function #snd_pcm_avail_update() updates the current
>  available count of samples for writing (playback) or filled samples for
>  reading (capture). This call is mandatory for updating actual r/w pointer.
>  Using standalone, it is a light method to obtain current stream position,
> -because it does not require the user <-> kernel context switch, but the value
> -is less accurate, because ring buffer pointers are updated in kernel drivers
> +because while it does require a user <-> kernel context switch, the value is
> +just copied from the kernel, and not updated by synchronously asking the hardware
> +about its current position. The ring buffer pointers are updated in kernel drivers
>  only when an interrupt occurs. If you want to get accurate stream state,
> -use functions #snd_pcm_avail(), #snd_pcm_delay() or #snd_pcm_avail_delay().
> +use functions #snd_pcm_avail(), #snd_pcm_delay(), #snd_pcm_avail_delay() or
> +#snd_pcm_status().
>  </p>
>  <p>
>  The function #snd_pcm_avail() reads the current hardware pointer
> -- 
> 1.9.1
>
David Henningsson Oct. 27, 2014, 12:21 p.m. UTC | #2
On 2014-10-27 13:17, Takashi Iwai wrote:
> At Mon, 27 Oct 2014 13:11:42 +0100,
> David Henningsson wrote:
>>
>> While reading alsa-lib code, I discovered that snd_pcm_avail_update
>> does require a user-kernel context switch:
>
> Not "does" but "may"...
>
>> snd_pcm_avail_update() -> snd_pcm_hw_avail_update() -> sync_ptr()
>> -> sync_ptr1() -> ioctl()
>
> ... since this depends on the setup.  sync_ptr() calls sync_ptr1()
> only when the status mmap isn't done.

Ah, that's what I was missing. Thanks.

>
>
> Takashi
>
>> The documentation says it does not, so let's fix the documentation.
>>
>> Signed-off-by: David Henningsson <david.henningsson@canonical.com>
>> ---
>>   src/pcm/pcm.c | 8 +++++---
>>   1 file changed, 5 insertions(+), 3 deletions(-)
>>
>> diff --git a/src/pcm/pcm.c b/src/pcm/pcm.c
>> index 4a7be6c..e57e362 100644
>> --- a/src/pcm/pcm.c
>> +++ b/src/pcm/pcm.c
>> @@ -403,10 +403,12 @@ The function #snd_pcm_avail_update() updates the current
>>   available count of samples for writing (playback) or filled samples for
>>   reading (capture). This call is mandatory for updating actual r/w pointer.
>>   Using standalone, it is a light method to obtain current stream position,
>> -because it does not require the user <-> kernel context switch, but the value
>> -is less accurate, because ring buffer pointers are updated in kernel drivers
>> +because while it does require a user <-> kernel context switch, the value is
>> +just copied from the kernel, and not updated by synchronously asking the hardware
>> +about its current position. The ring buffer pointers are updated in kernel drivers
>>   only when an interrupt occurs. If you want to get accurate stream state,
>> -use functions #snd_pcm_avail(), #snd_pcm_delay() or #snd_pcm_avail_delay().
>> +use functions #snd_pcm_avail(), #snd_pcm_delay(), #snd_pcm_avail_delay() or
>> +#snd_pcm_status().
>>   </p>
>>   <p>
>>   The function #snd_pcm_avail() reads the current hardware pointer
>> --
>> 1.9.1
>>
>
diff mbox

Patch

diff --git a/src/pcm/pcm.c b/src/pcm/pcm.c
index 4a7be6c..e57e362 100644
--- a/src/pcm/pcm.c
+++ b/src/pcm/pcm.c
@@ -403,10 +403,12 @@  The function #snd_pcm_avail_update() updates the current
 available count of samples for writing (playback) or filled samples for
 reading (capture). This call is mandatory for updating actual r/w pointer.
 Using standalone, it is a light method to obtain current stream position,
-because it does not require the user <-> kernel context switch, but the value
-is less accurate, because ring buffer pointers are updated in kernel drivers
+because while it does require a user <-> kernel context switch, the value is
+just copied from the kernel, and not updated by synchronously asking the hardware
+about its current position. The ring buffer pointers are updated in kernel drivers
 only when an interrupt occurs. If you want to get accurate stream state,
-use functions #snd_pcm_avail(), #snd_pcm_delay() or #snd_pcm_avail_delay().
+use functions #snd_pcm_avail(), #snd_pcm_delay(), #snd_pcm_avail_delay() or
+#snd_pcm_status().
 </p>
 <p>
 The function #snd_pcm_avail() reads the current hardware pointer