Linux Sound System

Gazette Linux n°182 — Janvier 2011

par Mohan Lal Jangir (Copyright © 2011) mohanlaljangir CHEZ gmail POINT com

traduction par Rochdi Hamdi(tous droits réservés) rochdi POINT hamdi POINT ll CHEZ gmail POINT com

relecture exemple email CHEZ exemple POINT com


En deux décennies, Linux est passé du stade de nouveau née a celui de Système d'exploitation accomplie. Dans le domaine du multimédia, par exemple, Linux supporte aujourd'hui pratiquement tout type de cartes et de formats audio/vidéo - quelque chose qui lui manquait dans ses débuts. Le support sonore de Linux a subit une intéressante évolution en passant par différentes phases. Cet article vise à résumer l'historique du développement du système sonore de Linux, faire une comparaison des différentes architectures, et a conclure avec deux vraies/véritables (quoique petites) applications audio.

En 1992, Hannu Savolainen a écrit le premier pilote pour carte son Sound Blaster, seule carte disponible à ce moment là. Il l'appela Linux Sound Driver. Avec l'apparition de nouvelles cartes, il se mit a développer le Open Sound System (OSS) ; un petit progiciel ingénieux fournissant une API pour les applications audio.

L'API OSS était basé sur le système Unix standard et les appels systèmes (i.e. POSIX open, read, write, ioctl), et par conséquent le développement des applications audio est devenu pratiquement similaire au développement des autres applications linux. De plus, les applications audio étaient portatives sur toutes les variantes des systèmes d'exploitation Unix (UNIX, Linux, BSD etc).

Le code source d'OSS fut sorti sous licence GPL, et fut inclus dans le noyau principal de Linux. Alors que le développement d'OSS était encore en cours, Hannu Savolainen passa un contrat avec 4Front Technologies et ils décidèrent de se faire de l'argent avec une version commerciale d'OSS. Par la suite, Hannu arrêta de travailler sur la version sous licence GPL d'OSS et continua le développement de la version propriétaire pour 4Front Technologies. De ce fait, le pilote sonore du noyau fut bloqué à OSS v3.8

Plus tard, Alan Cox, un développeur Linux reconnu, fut sponsorisé par Red Hat Software pour améliorer et modulariser le noyau du pilote sonore. Alan Cox et d'autres ont corrigé beaucoup de bug et ont ajouté des pilotes pour de nouvelles cartes sons. Le pilote modifié sortit pour la première fois avec Red Hat 5.0. Etant sous GPL, ces modifications furent plus tard inclusent dans le noyau principal Linux. Cependant, le développement s'est heurté à un mur après l'arrêt du sponsoring par Red Hat, car il n'y avait pas de mainteneur dédié pour l'OSS GPL.

La communauté pro-GPL n'aimait pas OSS. En 1998 Jaroslav Kysela écrit un pilote pour la carte son Gravis Ultrasound, qu'il développa par la suite en une nouvelle architecture sonore nommée ALSA (Advanced Linux Sound Architecture). Le développement d'ALSA resta indépendant jusqu'en 2002, quand ALSA était inclus dans le noyau 2.5 avec OSS.

L'architecture d'ALSA s'est clairement séparé de l'APi POSIX et a présenté un ensemble bien plus grand et plus complexe d'API. Bien que la communauté pro-GPL soutenait ALSA, ce dernier n'a pas été très bien accueilli par les développeurs d'application audio, qui devaient réécrire leurs applications en utilisant l'API ALSA, beaucoup plus complexe. L'autre problème venait de la potentielle perte de portabilité des applications car ALSA était uniquement disponible sur linux.

Pour palier à ce problème, ALSA introduit une couche d’émulation pour OSS. Cela permit de lancer des applications audio utilisant OSS sur une architecture de type ALSA sans modifier cette dernière.

Cependant, comme prévu, un débat animé sur les qualités/imperfections d'OSS et d'ALSA vu le jour. ALSA fut désigné comme ayant des fonctionnalités supplémentaires dont ne disposait pas OSS à ce moment là. Cependant, OSS 4.0 (la version propriétaire) clamait les avoir toutes arrangées. Alors qu'ALSA était critiqué pour son ensemble d'API complexes, OSS avait l'avantage d'avoir la conformité POSIX. D'un autre coté, OSS fut critiqué pour sa licence non GPL, chose qu’ALSA avait pour lui.

Finalement, ALSA fut grandement mis en avant par Linux : dans son noyau 2.6, Linux mit ALSA en tant qu'architecture sonore par défaut, et OSS fut marqué comme étant obsolète.

En 2007, par un acte surprenant, 4Front Technologies sortit OSS v4.0 sous GPL -ce qui fit froncer beaucoup de sourcils. Même si certain experts ont considéré cela comme étant "trop peu et trop tard", d'autres prédirent le possible retour d'OSS dans le noyau.

Avant de conclure cet article, jetons un coup d'œil à une petite application audio écrite dans les deux API afin de voir une réelle comparaison.

Cet exemple d'application peut lire un fichier PCM, 2-voie (stéréo) non compressé. Ci dessous les propriétés du fichier audio vue par la commande du fichier et mplayer

root@localhost:/root# file sample.wav
sample.wav: RIFF (little-endian) data, WAVE audio, Microsoft PCM, 16 bit, stereo 44100 Hz

root@localhost:/root# mplayer sample.wav
==========================================================================
Forced audio codec: mad
Opening audio decoder: [pcm] Uncompressed PCM audio decoder
AUDIO: 44100 Hz, 2 ch, s16le, 1411.2 kbit/100.00% (ratio: 176400->176400)
Selected audio codec: [pcm] afm: pcm (Uncompressed PCM)
==========================================================================

Vous pouvez utiliser n'importe quel fichier audio .wav ayant des propriétés similaires. Nous avons utilisé un fichier audio au format .wav car ces derniers ne sont pas encodés. (Pour les mêmes raisons, vous ne devriez pas utiliser les mp3 et autres format encodés avec cette application.)

Le tableau suivant montre les applications OSS et ALSA côte à côte :

#include <stdio.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/soundcard.h>

int main()
{
    int afd, ret, fd, val;
    unsigned char buf[2048];

    /* open audio device file */
    fd = open("/dev/dsp", O_WRONLY);
#include <alsa/asoundlib.h>

int main()
{
    int fd, ret;
    snd_pcm_t *handle;
    snd_pcm_sframes_t frames;
    static char *device = "default"; /* playback device */
    unsigned char buf[2*1024];

    /* open playback device */
    snd_pcm_open(&handle, device, SND_PCM_STREAM_PLAYBACK, 0);
    /* set sample size (8 or 16 bits) */
    val = 16;
    ioctl(fd, SOUND_PCM_WRITE_BITS, &val);

    /* set the number of channels */
    val = 2;
    ioctl(fd, SOUND_PCM_WRITE_CHANNELS, &val);

    /* set the PCM sampling rate for the device */
    val = 44100;
    ioctl(fd, SOUND_PCM_WRITE_RATE, &val);
    /* configure playback device as per input audio file */

    snd_pcm_set_params(handle,
         SND_PCM_FORMAT_S16_LE,
         SND_PCM_ACCESS_RW_INTERLEAVED,
         2 /* channels */,
         44100 /* sample rate */,
         1,
         500000/* 0.5 sec */);
    /* open audio file */
    afd = open("sample.wav", O_RDONLY);

    /* play audio file */
    while((ret = read(afd, buf, sizeof(buf))) > 0)
         write(fd, buf, ret);

    close(fd);
    return 0;
}
    /* open audio file */
    fd = open("sample.wav", O_RDONLY);

    /* play audio file */
    while((ret = read(fd, buf, sizeof(buf))) > 0)
    {
        snd_pcm_sframes_t total_frames = snd_pcm_bytes_to_frames(handle, ret);
         frames = snd_pcm_writei(handle, buf, total_frames);
    }

    snd_pcm_close(handle);
    return 0;
}

La première différence que vous verrez sont les APIs. Comme dit précédemment, l'application OSS utilise les APIs POSIX, alors que l'ALSA en utilise d'autre. Aussi, quand vous compilez les applications, notez que l'application OSS compile directement alors que l'ALSA nécessite un lien avec libasound (ce qui signifie que vous devez avoir la librairie ALSA installée).

Les différences et les possibilités offertes par les APIs est un débat sans fin. En ce qui concerne le noyau 2.6.36, Linux continue d'utiliser ALSA. Cependant, beaucoup de développeurs d'application audio attendent vivement le retour d'OSS.


Mohan Lal Jangir

Mohan Lal Jangir travaille en tant que chef de développement à Samsung India Software Operations, à Bangalore, en Inde. Il a un Master en technologie d'ordinateurs /Master de la technologies informatique de l’IIT Delhi, et est vraiment intéressé par Linux, les réseaux et la sécurité réseau.


Adaptation française de la Gazette Linux

L'adaptation française de ce document a été réalisée dans le cadre du Projet de traduction de la Gazette Linux

Cet article est publié selon les termes de la Open Publication License. La Linux Gazette n'est ni produite, ni sponsorisée, ni avalisée par notre hébergeur principal, SSC, Inc.

Vous pourrez lire d'autres articles traduits et en apprendre plus sur ce projet en visitant notre site http://www.traduc.org/Gazette_Linux

Si vous souhaitez apporter votre contribution, n'hésitez pas à nous rejoindre, nous serons heureux de vous accueillir.