On 2001-04-17 21:50 +0200, Fr�d�ric Boiteux wrote:
> Le Mon, Apr 16, 2001 at 10:04:46PM +0200, Andre Majorel a �crit :

> > Essaye de catter un .wav 8 bits dans /dev/dsp. Si tu entends de
> > la musique et pas un "gargouillis", c'est vraisemblablement que
> > c'est la configuration de /dev/dsp en 16 bits qui � �chou�.

(C'est vrai qu'avec un accent sur le "a", �a fait plus riche.
Hem.)

>   Effectivement, un �cat
>   /usr/share/xemacs21/packages/etc/sounds/im_so_happy.wav > /dev/dsp�
> donne un son correct, le test que j'effectuait �tait de jouer un morceau en
> mp3
> par un �splay test.mp3� ...
>   Mais je ne vois pas plus comment r�soudre mon probl�me ? est-ce un probl�me
> d� au noyau ou � une config utilisateur ??

Sais pas. Je vois deux possibilit�s:

- splay utilise l'API OSS et celle-ci est cass�e dans le kernel.
  Pour que ton kernel supporte l'API OSS, il faut donner les
  options de configuration idoines. Si je me souviens bien, en
  2.2, il fallait le module "sound".

- splay utilise une autre API (Alsa ?) que le passage en 2.4
  casse.

Pour savoir si OSS marche compile et ex�cute ce programme. Tu
dois entendre "au clair du la lune" et le son doit �tre tr�s
doux, vaguement genre ocarina dans le bas du registre.

  $ make osstest && ./osstest

/*
 *      osstest.cc - test whether OSS works properly 
 *      AYM 2001-04-18
 */


#include <errno.h>
#include <fcntl.h>
#include <math.h>
#include <stdarg.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <sys/types.h>

#include <unistd.h>

#include <sys/soundcard.h>    /* OSS */


static const double twopi       = 8 * atan (1);
static const char  *device      = "/dev/dsp";
static const double sample_rate = 8000;    // OSS default


int main (int argc, char *argv[])
{
  int fd;

  // Open device
  fd = open (device, O_WRONLY);
  if (fd == -1)
  {
    fprintf (stderr, "%s: %s\n", device, strerror (errno));
    exit (1);
  }

  // Configure for 16-bit output, little-endian
  {
    int format = AFMT_S16_LE;
    if (ioctl (fd, SNDCTL_DSP_SETFMT, &format) != 0)
    {
      fprintf (stderr, "%s: %s\n", device, strerror (errno));
      exit (1);
    }
    if (format != AFMT_S16_LE)
    {
      fprintf (stderr, "%s: format %d after ioctl()\n", device, format);
      exit (1);
    }
  }

  // Play tune
  {
    static int tune_note[] = { 0, 0, 0, 2, 4, 2, 0, 4, 2, 2, 0 };
    static int tune_dur[]  = { 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 2 };

    for (size_t n = 0; n < sizeof tune_note / sizeof *tune_note; n++)
    {
      double freq_hz     = 440 * pow (2, tune_note[n] / 12.0);
      double dur_samples = tune_dur[n] * 0.25 * sample_rate;

      unsigned long c = 0;
      unsigned long cmax = c + (unsigned long) (0.75 * dur_samples);
      for (; c < cmax; c++)
      {
        short v = short (32767 * sin (c / sample_rate * twopi * freq_hz));
        char buf[2];
        buf[0] = v & 0xff;
        buf[1] = v >> 8;
        if (write (fd, buf, sizeof buf) != sizeof buf)  // Assume no signals
        {
          fprintf (stderr, "%s: %s\n", device, strerror (errno));
          exit (1);
        }
      }

      cmax += (unsigned long) (0.25 * dur_samples);
      for (; c < cmax; c++)
      {
        char buf[2];
        buf[0] = 0;
        buf[1] = 0;
        if (write (fd, buf, sizeof buf) != sizeof buf)  // Assume no signals
        {
          fprintf (stderr, "%s: %s\n", device, strerror (errno));
          exit (1);
        }
      }
    }
  }

  if (close (fd) != 0)
  {
    fprintf (stderr, "%s: %s\n", device, strerror (errno));
    exit (1);
  }
  return 0;
}


Pour savoir si splay utilise OSS,

  strace splay 2>&1 | grep SNDCTL

-- 
Andr� Majorel <[EMAIL PROTECTED]>
http://www.teaser.fr/~amajorel/


Répondre à