[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: carte son SoundBlaster PCI128 & kernel 2.4.2



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 <amajorel@teaser.fr>
http://www.teaser.fr/~amajorel/



Reply to: