From: marcelg <marcelsbox@quicknet.nl>
To: alsa-devel@alsa-project.org
Subject: PCM buffering ussues ( or probably the lack of understanding )
Date: Sat, 20 Apr 2013 09:13:34 +0200 [thread overview]
Message-ID: <5172401E.8020708@quicknet.nl> (raw)
I am working on a PCM driver, have some issues and thing which are
unclear to me, hopefully somebody here can clarify something for me.
My PCM driver is straigh forward:
- Copy callback copies the frames received in the callback into a small
ringbuffer and starts a DMA transfer to the hardware.
- DMA interrupt each times take the next chunk from the ringbuffer.
- In the DMA interrupt the number of frames is counted, if te number >=
period_size reported in runtime_struct pcm_period_elapsed() is called.
- the pointer which is read by the pcm_pointer() callback is updated in
each DMA interrupt.
When using mplayer this works without problems, however with other
applications like mpg123 its causes a lot of problems, for some reaosns
I do not understand yet.
It has something to do with buffer handling.
basically in the cm driver I can influence a few parameters:
periods_min/periods_max
period_bytes_min, period_bytes_max
buffer_size ( should be sufficient to hold periods_max with
period_bytes_max I assume )
As far as I understand periods_min/periods_max is the size (number of
buffer entries) of the internal ringbuffer Alsa uses.
- Why is there both a min and a max ? How is chosen what will be used ?
- Currently my period_min is set to 1 and my period_max set to 4, If I
increase the period_max value it does not start properly, it seems that
the samples are not deliverered in time.
Is there any explanation for this, does the Alsa layer not any
pre-buffering before the first copy() is called ?
- Is there any advice / guidline for period min/max values ? I checked
sourecs of severl drivers, some use 1 and some use values like 32 or
more for period_max.
The same applies to buffer_bytes min/max, currently my min is set to
128bytes , max to 2kB, larger values of max seem to cause more problems.
From the documentation I understand that it does not matter if
pcm_period_elapsed() is not always called, How dows the ALSA layer
then know how many samples are played.
the pointer value read the pcm_pointer() only counts from
[0..period_max] so what if 2 or more calls to period_elapsed() are
skipped ?
Suppose I want to have some buffering inside my pcm driver, how will I
be able to get some samples in advance before starting playback ? Can I
just call pcm_period_elapsed() a few times in a row to get the buffer
filled
before starting the actual playcback, or does this cause side effects ?
I noticed that the number of frames passed to pcm_copy is often less
than the periods_size, is this determined by the application ?
Lots of questions, but I try to understand the odd behaviour with
certain applications ( and the best settings for a pcm driver which will
work with most applications )
Any help would be appreciated.
Marcel
next reply other threads:[~2013-04-20 7:13 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-04-20 7:13 marcelg [this message]
2013-04-20 7:52 ` PCM buffering ussues ( or probably the lack of understanding ) Lars-Peter Clausen
2013-04-20 8:46 ` Clemens Ladisch
[not found] ` <5172750A.4030805@quicknet.nl>
2013-04-20 11:17 ` Lars-Peter Clausen
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=5172401E.8020708@quicknet.nl \
--to=marcelsbox@quicknet.nl \
--cc=alsa-devel@alsa-project.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.