All of lore.kernel.org
 help / color / mirror / Atom feed
From: Carlo Wood <carlo@alinoe.com>
To: Jaroslav Kysela <perex@perex.cz>
Cc: "alsa-devel@lists.sourceforge.net" <alsa-devel@lists.sourceforge.net>
Subject: OSS layer still doesn't ignore xruns.
Date: Thu, 17 Jul 2003 00:44:31 +0200	[thread overview]
Message-ID: <20030716224431.GA24371@alinoe.com> (raw)
In-Reply-To: <Pine.LNX.4.44.0307152022090.27533-200000@pnote.perex-int.cz>

[-- Attachment #1: Type: text/plain, Size: 4637 bytes --]

On Tue, Jul 15, 2003 at 08:31:50PM +0200, Jaroslav Kysela wrote:
> I looked to the problem and it seems that the overrun state is handled 
> differently in the OSS API than ALSA implemented. It seems that the stream 
> is not stopped but rather the oldest period (fragment) is discarded.
> 
> The new code (plus some optimization) is in the ALSA CVS tree. The patch 
> is attached to this e-mail.

This patch does not solve the problem.
As soon as the buffers runs exactly full - which is now a coincidence,
but happens reasonable quickly, the alsa layer detects an "overrun"
and stops the stream.

The stream is then still not restarted.

Attached is the source code of a slightly adjusted
test case that shows the problem.

Example output of attached test code:

>a.out
    Allocated 2 buffers of 1024 bytes.
    Allocated 2 buffers of 2048 bytes.
    Allocated 2 buffers of 4096 bytes.
    Successfully allocated a buffer that is large enough.
    Available bytes: 0
    Available bytes: 1632
    Available bytes: 3264
    Available bytes: 4896
    Available bytes: 6528
    Available bytes: 8160
    Available bytes: 5696
    Available bytes: 7328
    Available bytes: 4864
    Available bytes: 6496
    Available bytes: 8128
    Available bytes: 5664
    Available bytes: 7296
    Available bytes: 4832
    Available bytes: 6464
    Available bytes: 8096
    Available bytes: 5632
    Available bytes: 7264
    Available bytes: 4800
    Available bytes: 6432
    Available bytes: 8064
    Available bytes: 5600
    Available bytes: 7232
    Available bytes: 4768
    Available bytes: 6400
    Available bytes: 8032
    Available bytes: 5568
    Available bytes: 7200
    Available bytes: 4736
    Available bytes: 6368
    Available bytes: 8000
    Available bytes: 5536
    Available bytes: 7168
    Available bytes: 4704
    Available bytes: 6336
    Available bytes: 7968
    Available bytes: 5504
    Available bytes: 7136
    Available bytes: 4672
    Available bytes: 6304
    Available bytes: 7936
    Available bytes: 5472
    Available bytes: 7104
    Available bytes: 4640
    Available bytes: 6272
    Available bytes: 7904
    Available bytes: 5440
    Available bytes: 7072
    Available bytes: 4608
    Available bytes: 6240
    Available bytes: 7872
    Available bytes: 5408
    Available bytes: 7040
    Available bytes: 4576
    Available bytes: 6208
    Available bytes: 7840
    Available bytes: 5376
    Available bytes: 7008
    Available bytes: 4544
    Available bytes: 6176
    Available bytes: 7808
    Available bytes: 5344
    Available bytes: 6976
    Available bytes: 4512
    Available bytes: 6144
    Available bytes: 7776
    Available bytes: 5312
    Available bytes: 6944
    Available bytes: 4480
    Available bytes: 6112
    Available bytes: 7744
    Available bytes: 5280
    Available bytes: 6912
    Available bytes: 4448
    Available bytes: 6080
    Available bytes: 7712
    Available bytes: 5248
    Available bytes: 6880
    Available bytes: 4416
    Available bytes: 6048
    Available bytes: 7680
    Available bytes: 5216
    Available bytes: 6848
    Available bytes: 4384
    Available bytes: 6016
    Available bytes: 7648
    Available bytes: 5184
    Available bytes: 6816
    Available bytes: 4352
    Available bytes: 5984
    Available bytes: 7616
    Available bytes: 5152
    Available bytes: 6784
    Available bytes: 4320
    Available bytes: 5952
    Available bytes: 7584
    Available bytes: 5120
    Available bytes: 6752
    Available bytes: 4288
    Available bytes: 5920
    Available bytes: 7552
    Available bytes: 5088
    Available bytes: 6720
    Available bytes: 4256
    Available bytes: 5888
    Available bytes: 7520
    Available bytes: 5056
    Available bytes: 6688
    Available bytes: 4224
    Available bytes: 5856
    Available bytes: 7488
    Available bytes: 5024
    Available bytes: 6656
    Available bytes: 4192
    Available bytes: 5824
    Available bytes: 7456
    Available bytes: 4992
    Available bytes: 6624
    Available bytes: 4160
    Available bytes: 5792
    Available bytes: 7424
    Available bytes: 4960
    Available bytes: 6592
    Available bytes: 4128
    Available bytes: 5760
    Available bytes: 7392
    Available bytes: 4928
    Available bytes: 6560
    Available bytes: 8192
    Successfully caused an xrun.
    non-blocking fragments: 2
    non-blocking bytes: 8192
    Available bytes in buffer: 5728
    Additionally read 1024 bytes.
    Additionally read 1024 bytes.
    Additionally read 1024 bytes.
    Additionally read 1024 bytes.
    Stream is not restarted after xrun.

-- 
Carlo Wood <carlo@alinoe.com>

[-- Attachment #2: testcode.c --]
[-- Type: text/plain, Size: 2771 bytes --]

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <sys/soundcard.h>
#include <time.h>

int main(void)
{
  int fd;
  int res = 0x7fff0009;
  audio_buf_info info;
  int prev_size = 0;
  do
  {
    ++res;
    close(fd);
    fd = open("/dev/dsp", O_RDONLY);
    if (fd == -1) { perror("open"); exit(127); }
    if (ioctl(fd, SNDCTL_DSP_SETFRAGMENT, &res) == -1) {
      perror("ioctl"); exit(127); }
    if (ioctl(fd, SNDCTL_DSP_GETISPACE, &info) == -1) {
      perror("read"); exit(127); }
    printf("    Allocated %d buffers of %d bytes.\n", info.fragstotal, info.fragsize);
    if (prev_size == info.fragsize * info.fragstotal)
    {
      printf("    It seems impossible to set a recording buffer with a\n"
             "    total size of at least 8192 bytes.  This is not going\n"
             "    to work with ViaVoice.  Sorry.\n");
      exit(126);
    }
    prev_size = info.fragsize * info.fragstotal;
  }
  while (prev_size < 8192);
  printf("    Successfully allocated a buffer that is large enough.\n");
  res = AFMT_S16_LE;
  if (ioctl(fd, SNDCTL_DSP_SETFMT, &res) == -1) {
    perror("ioctl"); exit(127); }
  res = 0;
  if (ioctl(fd, SNDCTL_DSP_STEREO, &res) == -1) {
    perror("ioctl"); exit(127); }
  res = 22050;
  if (ioctl(fd, SOUND_PCM_READ_RATE, 0xbfffdcfc) == -1) {
    perror("ioctl"); exit(127); }
  char buf[1024];
  if (read(fd, buf, sizeof(buf)) < 0) { perror("read"); exit(127); }
  static struct timespec naptime = { 0, 100000000 };
  do {
    if (ioctl(fd, SNDCTL_DSP_GETISPACE, &info) == -1) {
      perror("read"); exit(127); }
    printf("    Available bytes: %d\n", info.bytes);
    nanosleep(&naptime, 0);
  } while(info.bytes < info.fragsize * info.fragstotal);
  printf("    Successfully caused an xrun.\n");
  printf("    non-blocking fragments: %d\n", info.fragments);
  printf("    non-blocking bytes: %d\n", info.bytes);
  ssize_t bufsize = info.bytes;
  if (ioctl(fd, SNDCTL_DSP_GETISPACE, &info) == -1) {
    perror("read"); exit(127); }
  printf("    Available bytes in buffer: %d\n", info.bytes);
  ssize_t trlen = 0;
  int nf = 0;
  for (;;)
  {
    if (info.fragments > 0) {
      ssize_t rlen;
      if ((rlen = read(fd, buf, sizeof(buf))) < 0)
      { perror("read"); exit(127); }
      printf("    Additionally read %d bytes.\n", rlen);
      trlen += rlen;
      if (trlen > bufsize) {
        printf("    Read %d bytes: stream successfully restarted.\n", trlen);
        break;
      }
      nf = 0;
    }
    else if (++nf > 10) {
      printf("    Stream is not restarted after xrun.\n");
      exit(1);
    }
    if (ioctl(fd, SNDCTL_DSP_GETISPACE, &info) == -1) {
      perror("read"); exit(127); }
  }
  close(fd);
  return 0;
}


  parent reply	other threads:[~2003-07-16 22:44 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-07-15 12:01 OSS layer doesn't ignore xruns Carlo Wood
2003-07-15 18:31 ` Jaroslav Kysela
2003-07-16  0:11   ` Carlo Wood
2003-07-16 22:44   ` Carlo Wood [this message]
2003-07-17 10:14     ` OSS layer still " Jaroslav Kysela

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=20030716224431.GA24371@alinoe.com \
    --to=carlo@alinoe.com \
    --cc=alsa-devel@lists.sourceforge.net \
    --cc=perex@perex.cz \
    /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.