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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox