mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: shd@modeemi.cs.tut.fi (Heikki Orsila)
To: Linux Kernel Mailing List <linux-kernel@vger.kernel.org>
Cc: Alistair John Strachan <s0348365@sms.ed.ac.uk>
Subject: Re: [OT] ALSA userspace API complexity
Date: Thu, 5 Jan 2006 16:01:55 +0200	[thread overview]
Message-ID: <20060105140155.GC757@jolt.modeemi.cs.tut.fi> (raw)
In-Reply-To: <5rdrx-4Yl-43@gated-at.bofh.it>

Alistair John Strachan <s0348365@sms.ed.ac.uk> wrote:
> On Tuesday 03 January 2006 23:10, Tomasz K?oczko wrote:
> 2) ALSA API is to complicated: most applications opens single sound
>    stream.

> FUD and nonsense. I've written many DSP applications and very often I can
> recycle the same code for use in them.

It's not FUD and it's very true. I've written ALSA support for many 
programs and I still can't remember the tricks that are needed to get 
even basic things working.

Just look at error handling of libao-0.8.6 for a great example how 
complicated it is to write code for ALSA. The following code is directly 
from the source:

                /* try to write the entire buffer at once */
                err = internal->writei(internal->pcm_handle, ptr, len);

                /* it's possible that no data was transferred */
                if (err == -EAGAIN) {
                        continue;
                }

                if (err < 0) {
                        /* this might be an error, or an exception */
                        err = alsa_error_recovery(internal, err);
                        if (err < 0) {
                                fprintf(stderr,"ALSA write error: %s\n",
                                                snd_strerror(err));
                                return 0;
                        }

                        /* abandon the rest of the buffer */
                        break;
                }

alsa_error_recovery() expands to 30 lines of more logic. This is pretty 
insane considering that libao _only_ writes data to device and does 
nothing else. If ALSA was done properly, the main loop would simply be:

                err = internal->writei(internal->pcm_handle, ptr, len);

                /* it's possible that no data was transferred */
                if (err == -EAGAIN || err == -EINTR) {
                        continue;
                }

		if (err < 0) {
			/* BAD BAD */
		}

When I originally ran into this signal handling brain damage of ALSA, I 
had to actually look into other programs how they handle signals because 
ALSA documentation is so bad. The core problem is of course the broken 
API, not the bad documentation.

A small note, libao can not handle EINTR properly. A patch has been 
submitted already.

I've long ago stopped using ALSA API because it is broken. But if you 
wanted to make ALSA usable by real people you might considering adding 3 
functions (there are ~300 already so not much loss):

	err = alsa_simple_pcm_open(nchannels, sampleformat, samplingrate, frames_in_period /* 0 for automated default */ );
	err = alsa_simple_writei(); /* handless signal brokeness automagically */
	alsa_simple_close();

Basically ogg123/mpg123 like applications would only need 3 alsa calls. 
Now everyone reimplementing their own buggy versions of simple mechanisms.

-- 
Heikki Orsila			Barbie's law:
heikki.orsila@iki.fi		"Math is hard, let's go shopping!"
http://www.iki.fi/shd

       reply	other threads:[~2006-01-05 14:02 UTC|newest]

Thread overview: 84+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <5rdrx-4Yl-43@gated-at.bofh.it>
2006-01-05 14:01 ` Heikki Orsila [this message]
2006-01-05 14:24   ` Jaroslav Kysela
2006-01-05 14:45     ` Heikki Orsila
2006-01-10  9:22       ` Jaroslav Kysela
2006-01-10 11:50         ` Heikki Orsila
2006-01-05 14:51     ` Olivier Galibert
2006-01-05 15:26       ` Alexander E. Patrakov
2006-01-05 15:30         ` Jaroslav Kysela
2006-01-05 16:01           ` Alexander E. Patrakov
2006-01-05 18:11         ` Florian Schmidt
2006-01-05 15:33       ` Jaroslav Kysela
2006-01-05 16:48         ` Marcin Dalecki
2006-01-05 15:27     ` Heikki Orsila
2006-01-05 14:49   ` Alistair John Strachan
2006-01-08  7:19 linux
2006-01-08 22:08 ` Hannu Savolainen
     [not found] <4uzow-1g5-13@gated-at.bofh.it>
     [not found] ` <5r0aY-2If-41@gated-at.bofh.it>
     [not found]   ` <5r3Ca-88G-81@gated-at.bofh.it>
     [not found]     ` <5reGV-6YD-23@gated-at.bofh.it>
     [not found]       ` <5reGV-6YD-21@gated-at.bofh.it>
     [not found]         ` <5rf9X-7yf-25@gated-at.bofh.it>
2006-01-04 11:56           ` Patrizio Bassi
2006-01-04 18:07             ` Florian Schmidt
2006-01-04 18:46               ` Alistair John Strachan
2006-01-05 18:59             ` Lee Revell
2006-01-05 20:06               ` Patrizio Bassi
2006-01-05 20:11                 ` Lee Revell
2006-01-05 20:47               ` Patrizio Bassi
  -- strict thread matches above, loose matches on Subject: below --
2005-07-26 15:08 [2.6 patch] schedule obsolete OSS drivers for removal Adrian Bunk
2006-01-03 19:37 ` Adrian Bunk
2006-01-03 23:10   ` Tomasz Kłoczko
2006-01-04  9:37     ` [OT] ALSA userspace API complexity Alistair John Strachan
     [not found]     ` <mailman.1136368805.14661.linux-kernel2news@redhat.com>
2006-01-04 11:00       ` Pete Zaitcev
2006-01-04 11:35         ` Jaroslav Kysela
2006-01-04 11:47           ` Pete Zaitcev
2006-01-04 14:23           ` Alistair John Strachan
2006-01-05 11:41             ` Olivier Galibert
2006-01-05 12:01           ` Tomasz Kłoczko
2006-01-05 12:23             ` Jaroslav Kysela
2006-01-05 14:21               ` Olivier Galibert
2006-01-05 15:07               ` Tomasz Kłoczko
2006-01-05 16:14                 ` Takashi Iwai
2006-01-05 17:19                   ` Marcin Dalecki
2006-01-05 20:13                   ` Tomasz Kłoczko
2006-01-07 14:32                     ` Takashi Iwai
2006-01-08  2:03                       ` Olivier Galibert
2006-01-08  2:26                         ` Martin Drab
2006-01-08 13:21                           ` Olivier Galibert
2006-01-08 13:32                             ` Jaroslav Kysela
2006-01-08 23:18                               ` Pavel Machek
2006-01-08  9:42                         ` Jaroslav Kysela
2006-01-08 13:04                           ` Olivier Galibert
2006-01-08 13:23                             ` Jaroslav Kysela
2006-01-08 13:38                           ` Marcin Dalecki
2006-01-05 23:06                   ` Hannu Savolainen
2006-01-05 23:39                     ` Lee Revell
2006-01-05 23:56                       ` Hannu Savolainen
2006-01-06  0:03                         ` Lee Revell
2006-01-05 23:40                     ` Lee Revell
2006-01-05 23:59                       ` Hannu Savolainen
2006-01-06 15:03                         ` Stefan Smietanowski
2006-01-06 15:48                           ` Erik Mouw
2006-01-06 18:37                           ` Lee Revell
2006-01-10  9:43                         ` Jaroslav Kysela
2006-01-10 13:42                           ` Hannu Savolainen
2006-01-10 14:08                             ` Jaroslav Kysela
2006-01-10 14:17                               ` Hannu Savolainen
2006-01-10 20:13                               ` Marcin Dalecki
2006-01-06  0:14                       ` Marcin Dalecki
2006-01-06  0:29                         ` Martin Drab
2006-01-06  0:57                           ` Marcin Dalecki
2006-01-06  1:49                             ` Martin Drab
2006-01-06  1:21                         ` Zan Lynx
2006-01-06 15:17                           ` Stefan Smietanowski
2006-01-09 23:55                             ` jerome lacoste
2006-01-10  2:29                               ` Stefan Smietanowski
2006-01-06  3:14                     ` Edgar Toernig
2006-01-06  3:33                       ` Hannu Savolainen
2006-01-06 11:34                         ` Florian Schmidt
2006-01-06  7:47                     ` Jan Engelhardt
2006-01-07 14:45                     ` Takashi Iwai
2006-01-05 18:56                 ` Lee Revell
2006-01-05 22:39                 ` Joern Nettingsmeier
2006-01-05 23:44                   ` Tomasz Kłoczko
2006-01-05 23:49                   ` Olivier Galibert
2006-01-06  0:22                     ` Joern Nettingsmeier
2006-01-06  1:30                       ` Olivier Galibert
2006-01-06  2:20                       ` Hannu Savolainen
2006-01-10  9:54                         ` Jaroslav Kysela
2006-01-10 13:50                           ` Hannu Savolainen
2006-01-06  0:00                   ` Marcin Dalecki
2006-01-05 12:47             ` Leonard Milcin Jr.

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=20060105140155.GC757@jolt.modeemi.cs.tut.fi \
    --to=shd@modeemi.cs.tut.fi \
    --cc=linux-kernel@vger.kernel.org \
    --cc=s0348365@sms.ed.ac.uk \
    /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

all inboxes | Powered by JetHome®