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/