From: Lennart Poettering <mznyfn@0pointer.de>
To: alsa-devel@alsa-project.org
Subject: Re: Problems with safe API and snd-cs46xx
Date: Tue, 8 Sep 2009 15:38:25 +0200 [thread overview]
Message-ID: <20090908133825.GA22845@tango.0pointer.de> (raw)
In-Reply-To: <s5htyzej6fj.wl%tiwai@suse.de>
On Tue, 08.09.09 08:29, Takashi Iwai (tiwai@suse.de) wrote:
> > This turned out to cause a couple of issues with some drivers (i think
> > CS46xx is one of them, ice1712 another, I lack the hw in question, so
> > i never tried to track this down further). Basically on those drivers
> > both _set_buffer_size_near() and _set_periods_near() would fail with
> > EINVAL for some reason and then causing snd_pcm_hw_params() to return
> > ENOENT. Removing the two calls and calling snd_pcm_hw_params() would
> > however work. Changing the order of the first two calls, i.e. doing
> > first _set_periods_near() and then _set_buffer_size_near() would make
> > both calls succeed and the snd_pcm_hw_params(), too.
>
> The general problem in the hw_params setup is that the multiple
> parameters depending with each other are allowed almost freely.
> And, yet another problematic constraint is like cs46xx's one, the
> power-of-two rule. This limits strongly the value range.
>
> Also, another issue is the presence of three units to specify the same
> thing. There are units, frame, bytes and time for period and buffer
> sizes. Especially the former two and the time units can be
> inconsistent due to the integer rounding.
I always use 'frames' as unit for the actual calls, even if I said
bytes.
> > It would be good if the ALSA docs would actually mention in which
> > order those functions need to be called, if the order matters, which
> > it apparently does.
>
> There is no golden rule, unfortunately, AFAIK. There can be pretty
> weird hardware, e.g. the buffer size depending on rate. But, as a
> rule of thumb:
> 1. set access, format, channels and rate first,
> 2. if you need larger buffers than shorter periods, set the buffer
> size first,
> 3. set the period size only when you must specify it
This breaks on ice1712 at least...
> But, this can also fail when a hardware has a strong dependency
> between period and buffer sizes together with a strong constraint
> in period size. In that case, you may need to try another way,
> set period and hw_params.
For me the large buffers matter most. And large periods are the second
most important thing. Would something like the following make sense?
<snip>
snd_pcm_hw_params_any(pcm, hw);
snd_pcm_hw_params_set_access(pcm, hw, ...);
snd_pcm_hw_params_set_format(pcm, hw, ...);
snd_pcm_hw_params_set_rate_near(pcm, hw, ...);
snd_pcm_hw_params_set_channels_near(pcm, hw, ...);
snd_pcm_hw_params_copy(hw2, hw);
/* We care more about buffer size than the period size, so try setting
things in this order first */
snd_pcm_hw_params_set_buffer_size_near(hw, ...);
snd_pcm_hw_params_set_periods_near(hw, ...);
if (snd_pcm_hw_params(pcm, hw) < 0) {
/* This order didn't work, so let's try it the other way round */
snd_pcm_hw_params_set_periods_near(hw2, ...);
snd_pcm_hw_params_set_buffer_size_near(hw2, ...);
if (snd_pcm_hw_params(pcm, hw2) < 0) {
/* fail fatally */
....
}
}
</snip>
> > ens1371 has some issues with the buffer size: if you ask it for 65536
> > bytes in the playback buffer it will only agree to 65532. If the next
> > time you ask for 65532 right-away it will only agree to 65528, and so on...)
>
> The byte size can depend on the sample format and channels.
> This might be the case. Otherwise I don't see any strong restriction
> of buffer/period size in ens1371 code. It has the restriction of
> sample rates, though.
I only actually manipulate samples here, not bytes. So the prob is
that if you ask for a buffer size of n samples it will only agree to
n-1 samples, for every possible n. Other drivers don't do that.
Lennart
--
Lennart Poettering Red Hat, Inc.
lennart [at] poettering [dot] net
http://0pointer.net/lennart/ GnuPG 0x1A015CC4
next prev parent reply other threads:[~2009-09-08 13:38 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-09-05 12:24 Problems with safe API and snd-cs46xx Sophie Hamilton
2009-09-07 12:32 ` Takashi Iwai
2009-09-07 13:29 ` Tony Vroon
2009-09-07 14:18 ` Raymond Yau
2009-09-07 14:25 ` Error with custom driver: playback drain error (DMA or IRQ trouble?) Stefan Schoenleitner
2009-09-07 15:01 ` Problems with safe API and snd-cs46xx Takashi Iwai
2009-09-07 15:07 ` Raymond Yau
2009-09-07 15:15 ` Takashi Iwai
2009-09-07 22:47 ` Lennart Poettering
2009-09-07 23:10 ` Sophie Hamilton
2009-09-08 6:29 ` Takashi Iwai
2009-09-08 7:46 ` Sophie Hamilton
2009-09-08 8:53 ` Takashi Iwai
2009-09-09 11:04 ` Takashi Iwai
2009-09-09 12:29 ` Sophie Hamilton
2009-09-09 12:35 ` Takashi Iwai
2009-09-09 14:07 ` Lennart Poettering
2009-09-09 14:14 ` Takashi Iwai
2009-09-09 14:27 ` Lennart Poettering
2009-09-09 14:37 ` Takashi Iwai
2009-09-10 8:47 ` Raymond Yau
2009-09-08 13:38 ` Lennart Poettering [this message]
2009-09-08 14:42 ` Takashi Iwai
2009-09-09 2:18 ` Raymond Yau
2009-09-07 15:02 ` Sophie Hamilton
2009-09-07 17:04 ` Sophie Hamilton
2009-09-07 17:27 ` Takashi Iwai
2009-09-07 19:06 ` Sophie Hamilton
2009-09-08 6:38 ` Takashi Iwai
2009-09-08 8:19 ` Sophie Hamilton
2009-09-08 9:03 ` Takashi Iwai
2009-09-08 13:18 ` Raymond Yau
2009-09-08 13:21 ` Takashi Iwai
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=20090908133825.GA22845@tango.0pointer.de \
--to=mznyfn@0pointer.de \
--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.