HOWTO ALSA sound mixer aka dmix fr

Un article de Gentoo Linux Wiki.

Cet article fait partie des HOWTOs.
Méthodes d'installation CD Live Noyau et matériel Portables et Notebooks Portage Système Réseaux et Services Serveur X Logiciels fréquemment utilisés Autres

Cet article est en cours de traduction. Je finis bientôt, promis. Les plugins PCM étendent les fonctionnalités des périphériques PCM ; ils donnent accès aux fonctionnalités bas-niveau de ces périphériques, et permettent, par exemple de copier un flux d'un canal à un autre, vers un fichier, ou vers une carte son différente. Le plugin dmix permet de mixer différents flux sonores. Il est absolument indispensable aux gens dont la carte son ne supporte qu'un seul canal (ces cartes ne permettent pas le mixage matériel).

Sommaire

[modifier] Installation d'ALSA

ALSA guide on gentoo.org


[modifier] Préparation du noyau

Si vous avez un noyau 2.6, ALSA est probablement déjà installé, et vous pouvez sauter cette partie.
Si par contre vous utilisez toujours un noyau 2.4, et que vous avez installé les pilotes ALSA dans le kernel, il faut impérativement les recompiler en modules externes, ou dmix ne fonctionnera pas.

# cd /usr/src/linux

linux est un lien symbolique vers votre le répertoire contenant les sources du noyau. Si vous ne l'avez pas, il faut le créer, si vous l'avez, vérifiez qu'il pointe vers le bon répertoire !

  1. uname -v

Cette commande vous donnera la version de votre noyau, cela vous permettra de savoir quel répertoire lier, si, comme moi, vous ne savez plus sur quel noyau vous démarrez... ;)

  1. ln -s <kernel-source-dir> /usr/src/linux

Maintenant que le lien est en place, utilisons le :

# cd /usr/src/linux 
# make menuconfig

Il faut sélectionner la prise en charge du son (sound support), mais en aucun cas il ne faut préciser la prise en charge ALSA ou OSS

  Loadable module support  --->
      [*] Enable loadable module support

  Device Drivers  --->
      Sound  --->
          <*> Sound card Support
              Advanced Linux Sound Architecture  --->
                  < > Advanced Linux Sound Architecture
              Open Sound System  --->
                  < > Open Sound System (Deprecated)

Après cela, compilez et installez le nouveau noyau.

[modifier] Installation d'ALSA

On trouve dans : http://www.gentoo.org/doc/fr/alsa-guide.xml:

Pour commencer, vous devez trouver quelle carte son vous avez. Si vous ne le savez pas déjà, une méthode simple est de chercher « audio » dans l'affichage de la commande lspci. Vous pouvez l'installer avec emerge pciutils.
# lspci | grep -i audio
Multimedia audio controller: VIA Technologies, Inc. VT82C686 AC97 Audio Controller (rev 64)

Allez maintenant voir la Table des cartes son supportées par ALSA et cherchez-y la vôtre. Dans l'exemple précédent, vous auriez choisi le constructeur VIA et vous auriez alors obtenu une liste des chipsets connus de ce constructeur. Le chipset dans l'exemple précédent est « via82c686 » ; le lien « Details » nous informe alors que le pilote s'appelle via82xx. C'est la seule information utile sur cette page, vous pouvez ignorer le reste.

Avec cette information, nous pouvons installer alsa-driver pour votre carte son. Éditez donc le fichier /etc/make.conf et ajoutez lui une nouvelle option ALSA_CARDS. Dans cette variable, vous pouvez déclarer les pilotes audio que vous voulez utiliser :

ALSA_CARDS="via82xx"

Attention : Si vous avez plusieurs cartes sons dans votre système, séparez leur nom par une virgule dans la variable ALSA_CARDS. Par exemple : ALSA_CARDS="via82xx,emu10k1".

Si vous voulez la compatibilité OSS (hautement recommandée), vous devrez ajouter le paramètre USE « oss » dans /etc/make.conf. Vous êtes maintenant prêt à installer alsa-driver :

File: /etc/make.conf
...
ALSA_CARDS="via82xx"

Il faut maintenant vérifier la liste des paquets ALSA installés, les désinstaller, et réinstaller ceux dont on a vraiment besoin. Il se peut que vous deviez installer gentoolkit pour utiliser la commande equery.

% equery list alsa
[ Searching for package 'alsa' in all categories among: ]
 * installed packages
[I--] [  ] media-libs/alsa-lib-1.0.9 (0)
[I--] [  ] media-libs/alsa-oss-1.0.8-r1 (0)
[I--] [  ] media-sound/alsa-utils-1.0.9a (0.9)

# emerge --unmerge --ask alsa-oss alsa-lib alsa-utils

Les anciens paquets sont désinstallés, il faut maintenant installer les nouveaux paquets. On installe également mpg321, car il va nous permettre de tester la sortie son.

  # emerge alsa-lib alsa-driver alsa-oss alsa-utils mpg321
  
These are the packages that I would merge, in order: 
  
Calculating dependencies ...done! 
[ebuild   R   ] media-libs/alsa-lib-1.0.0_rc2 
[ebuild N     ] media-sound/alsa-driver-1.0.0_rc2 
[ebuild   R   ] media-libs/alsa-oss-1.0.0_rc2 
[ebuild   R   ] media-sound/alsa-utils-1.0.0_rc2 
[ebuild N     ] media-sound/mpg321

# etc-update
Scanning Configuration files... 
Exiting: Nothing left to do; exiting. :)

NB1 : alsa-oss permet de camoufler ALSA en OSS, c'est utile pour certaines applications qui ne gèrent qu'OSS. dmix fonctionne avec alsa-oss. Il est cependant recommandé d'utiliser ALSA en mode natif quand c'est possible.
NB2 : Il n'est pas nécessaire d'installer alsa-lib si vous utilisez un noyau 2.6

Oui, je n'avais aucun fichier de configuration à mettre à jour, mais vous en aurez probablement (j'avais déjà fait la manip).

Il faut maintenant éditer /etc/modules.d/alsa. Il faut décommenter certaines des lignes, et préciser le nom de votre carte son.

File: /etc/modules.d/alsa
# Fichier de configuration des modules d'Alsa 0.9.X. 
# $Header: /home/cvsroot/gentoo-x86/media-sound/alsa-utils/files/alsa-modules.conf-rc,v 1.1 2003/08/05 21:07:55 johnm Exp $ 

# ALSA portion 
alias char-major-116 snd 
# OSS/Free portion 
alias char-major-14 soundcore 

## 
## IMPORTANT: 
## Vous avez besoin de personnaliser cette section pour votre ou vos carte(s) spécifique(s) 
## et alors lancez la commande `update-modules'.
##  
## Lisez le fichier d'installation des drivers alsa dans /usr/share/doc pour de plus amples informations.
## 
##  ALSA portion 
alias snd-card-0 snd-cmipci 
## alias snd-card-1 snd-ens1371 
##  OSS/Free portion 
alias sound-slot-0 snd-card-0 
## alias sound-slot-1 snd-card-1 
## 

# OSS/Free portion - card #1 
alias sound-service-0-0 snd-mixer-oss 
alias sound-service-0-1 snd-seq-oss 
alias sound-service-0-3 snd-pcm-oss 
alias sound-service-0-8 snd-seq-oss 
alias sound-service-0-12 snd-pcm-oss 
##  OSS/Free portion - card #2 
## alias sound-service-1-0 snd-mixer-oss 
## alias sound-service-1-3 snd-pcm-oss 
## alias sound-service-1-12 snd-pcm-oss 

alias /dev/mixer snd-mixer-oss 
alias /dev/dsp snd-pcm-oss 
alias /dev/midi snd-seq-oss 

# Définissez ceci au nombre correspondant de cartes son. 
options snd cards_limit=1

J'ai déjà décommenté les lignes utiles dans le fichier précédent, ce qu'il vous faut faire est décommenter les lignes suivantes :

File: /etc/modules.d/alsa
alias char-major-116 snd 
alias char-major-14 soundcore 

alias snd-card-0 snd-cmipci
alias sound-slot-0 snd-card-0 

alias sound-service-0-0 snd-mixer-oss 
alias sound-service-0-1 snd-seq-oss 
alias sound-service-0-3 snd-pcm-oss 
alias sound-service-0-8 snd-seq-oss 
alias sound-service-0-12 snd-pcm-oss 

alias /dev/mixer snd-mixer-oss 
alias /dev/dsp snd-pcm-oss 
alias /dev/midi snd-seq-oss 

options snd cards_limit=1

Il faut ensuite insérer le nom du pilote de votre carte ici :

alias snd-card-0 snd-nom-du-pilote-de-votre-carte 

[modifier] Détermination du module ALSA utilisé pour gérer votre carte

Après avoir installé les paquets ALSA, il faut, en tant que superutilisateur, lancer la commande suivante : $ alsaconf (Ce petit outil détermine le pilote utilisé par votre carte /etc/modules.d/alsa) Quand vous le lancez pour la première fois, il essaiera tous les modules, et vous donnera une réponse courte, comme celle-ci :

  1. Your Card - Realtek 6xxx (snd_via82xx)
  2. Legacy sound

Il faut alors faire CTRL+C, et remplacer la ligne

alias snd-card-0 snd-cmipci

par celle-ci :

alias snd-card-0 snd-your-module

Cela fait, ouvrez /etc/modules.autoload.d/kernel-2.x-version, et ajoutez une ligne pour charger votre module.

Tip: Pour que le système retienne les paramètres du mixer, éditez /etc/conf.d/alsasound, et répondez YES derrière SAVE_MIXER_LEVELS.

On met les modules à jour :

# update-modules

On lance alsasound à chaque démarrage :

# rc-update add alsasound default 

On lance alsasound

# /etc/init.d/alsasound start 
* ALSA Detected... 
* Restoring Mixer Levels                     [ ok ] 

Il faut maintenant utiliser alsamixer, tous les cannaux étant silencieux par défaut. Montez le son sur MASTER et PCM.

Maintenant que toute cette phase préparatoire est terminée, passons au paramétrage du mixeur logiciel : dmix.

  • Ajouter des utilisateurs au groupe audio :

Il y a a plusieurs moyens de faire cela : Vous pouvez utiliser webmin, pour avoir une interface web,

Vous pouvez utiliser usermod, avec l'option -G

   # usermod -G users,audio,<other groups> <username>

Ou juste éditer le fichier de config :

   # more /etc/group | grep audio
   audio:x:18:

Editez le fichier et ajoutez les noms d'utilisateurs, séparés par une virgule. Mon fichier de config ressembnle à ça :

   audio:x:18:pawn

Il faut remplacer 'pawn' par un nom d'utilisateur valide.

C'est tout

[modifier] Credits

Redeeman
Redeeman
Redeeman
sametoms - small adjustments
w0rm - some corrections
ep98 - small adjustments

[modifier] Tests de base

  • emerge alsaplayer
% emerge media-sound/alsaplayer
  • On teste tout d'abord si dmix fonctionne (lancez les trois commandes successivement, n'attendez pas que l'une soit finie pour lancer l'autre !!) :
$ alsaplayer -o alsa -d plug:dmix un.mp3 &
$ aplay -D plug:dmix some.wav &
$ alsaplayer -o alsa -d plug:dmix un.mp3 &

Cela devrait fonctionner avec tous les ALSA 0.9.7. (Ca fonctionne également avec ALSA 0.9.8 et le pilote snd-intel8x0) Si le deuxième ou troisième flux sonore bégaie, ne vlous inquiétez pas, il peut ne s'agir que d'un problème de mémoire tampon.

[modifier] Le périphérique dmix

Il vous faut un périphérique de mixage, il s'agit d'un périphérique qui prend des clients différents en entrée (un lecteur audio, et les sons du système, par exemple), et qui le transmet à un différent de la carte son.

Ce périphérique peut être dmix, qui n'a pas besoin d'être configuré spécialement, puisqu'il existe par défaut. Cependant, si vous préférez, vous pouvez créer vous-même votre périphérique de mixage dans le fichier asoundrc, vous pourrez ainsi régler plus finement certains paramètres comme le temps de latence

Il vous faudra ensuite régler les applications audio qui gèrent ALSA pour qu'elles utilisent ce périphérique. Voir infra pour les paramètres de certaines applications

Vos applications OSS utiliseront l'émulation ALSA, il faut donc régler le périphérique ALSA-OSS pour qu'il utilise le même périphérique de mixage que les autres applications.

[modifier] Paramétrer dmix pour OSS

Vous êtes maintenant prêts à créer votre fichier ~/.asoundrc, pour utiliser le plugin dmix, et lier dsp0, et le périphérique PCM par défaut à votre démixeur PCM.

[modifier] Sans dmix

On va juste tester si OSS fonctionne correctement.

  • Configuration de .asoundrc pour tester aoss :
File: ~/.asoundrc
# ~/.asoundrc:

pcm.dsp0 {
    type plug
    slave.pcm "hw:0"
}
# or: 
#  pcm.dsp0 pcm.default
# si "default" n'a pas été redéfinit

ctl.mixer0 {
    type hw
    card 0
}
  • Testez aoss grâce à mpg321 en mode OSS :
# aoss mpg321 some.mp3 

Cette commande joue le fichier, mais le flux ne transite pas encore par dmix.

Nous entrons dans la phase difficile : redéfinir dsp0 pour qu'il se comporte comme dmix

[modifier] L'approche simpliste

File: ~/.asoundrc
# ~/.asoundrc

pcm.dsp0 {
    type plug
    slave.pcm "dmix"
}
# mixer0 peut demeurer inchangé, on ne l'utilise pas de toute façon, je crois.

ctl.mixer0 {
    type hw
    card 0
}

Testez ces paramètres avec mpg321 comme dans l'exemple ci-dessus. Avec ces paramètres, OSS devrait jouer au travers de dmix. Cependant, ceci ne fonctionnera pas sur certaines cartes, comme la M-Audio, l'Audiophile, ou d'autres cartes de marque Delta. Ces cartes nécessitent que le format audio passé à l'interface hw:0 réponde à certaines conditions. La solution est abordée plus bas.

[modifier] Une autre approche

Cette approche nécessite de définir les paramètres de dmix. Si une carte nécessite un certain format audio en entrée, il faut créer un périphérique dmix spécifique. Appelons-le ossmix

File: ~/.asoundrc
pcm.ossmix {
    type dmix
    ipc_key 1024          # Doit être unique
    slave {
        pcm "hw:0,0"      # On ne peut pas utiliser un périphérique de type "plug" ici.
        period_time 0
        period_size 1024  # doit être une puissance de 2
        buffer_size 8192  # pareil
        #format "S32_LE"
        #periods 128      # pareil
        #rate 8000        # Permet de tester, avec un taux de 8000, vous *allez* entendre si ossmix est utilisé    }
}
# Les bindings c'est cool. Celui-ci indique que dmix n'utilisera que les deux premiers cannaux
# ce qui est largement suffisant pour la plupart des applications OSS :
bindings {
        0 0   # from 0 => to 0
        1 1   # from 1 => to 1
}

pcm.dsp0 {
    type plug
    slave.pcm "ossmix"     # On utilise notre nouveau PCM ici !
}
# mixer0 comme précédemment
ctl.mixer0 {
    type hw
    card 0
}

Il est important que le périphérique ossmix fonctionne avec votre carte avec ALSA. Donc, il faut tester :

# alsaplayer -o alsa -d ossmix some.mp3
  • Un second exemple complexe pour une carte Nvidia nforce(2) (intel8x0) - alors que la solution précédente n'a pas fonctionné dans mon cas, celle qui vient si. (prise de forum.hardware.fr).

Enfin, j'admets que je ne comprends pas POURQUOI ça fonctionne, mais c'est ainsi ;-)

File: ~/.asoundrc (nvidia nforce setup)
pcm.nforce-hw {
        type hw
        card 0
}
pcm.!default {
        type plug
        slave.pcm "nforce"
}
pcm.nforce {
        type dmix
        ipc_key 1234
        slave {
                pcm "hw:0,0"
                period_time 0
                period_size 1024
                buffer_size 4096
                #rate 44100
                rate 48000
        }
}
ctl.nforce-hw {
        type hw
        card 0
}

Regardez au http://gentoo-wiki.com/HOWTO_ALSA_sound_mixer_aka_dmix#Hardware_Related_Configs pour davantage de configurations.

[modifier] Credits

Frank Barknecht

[modifier] Configuration logicielle

[modifier] arts et KDE

(1)KDE utilise la plupart du temps arts comme serveur de son, qui est un synthétiseur, un mélangeur, et plein d'autres choses.

((1)KDE is likely to use arts, which is a synthetizer, a muxer and other things.)

(2)arts peut rediriger sa sortie sur plusieurs périphriques audio. ((2)arts can redirect its output to several audio systems.) ((3)Set up these layers to use dmix themeselves.) ((4)Choose which in the control center.) (4) Sélectionnez le dans le centre de contrôle. (5)Remarquez que un redmarrage de artsd peut ête nécessaire pour que les changements soient effectifs (pour ce faire, se déconnecter où utiliser killall est suffisant. ((5)Note that a restart of artsd may be necessary for settings to take effect (logout, or maybe killall artsd is enough).)

(6) ARTS n'existe plus dans kde 4.0 (2005) ((6)ARTS is being discontinued as of kde 4.0 (2005))

[modifier] ALSA approach

(1)C'est la meilleur solution car elle ne nécessite pas un couche d'abstraction supplémentaire. ((1)This is the preferred solution since there is no need for another layer below that.)

(2) Ça ne fonctionne pas avec KDE 3.1.x et KDE 3.2.0, mais est résolu dès la version KDE 3.2.2. ((2)This doesn't work with in KDE 3.1.x and KDE 3.2.0 , it is fixed from KDE 3.2.2.)

[modifier] ESD approach

(1) The Enlightment sound daemon, aka ESD, aka esound {:-D ((1)The Enlightenment sound daemon, aka ESD, aka esound.)

(2)Si vous n'avez pas cette option dans votre centre de contrôle, vous devrez activer le support des options requises à la compilation, et vous devriez avoir esd installé. (ce logiciel est souvent empaqueté sous le nom esound) ((2)If you don't have such option in your control center, you have to recompile it with proper ./configure options. And of course you should have esd installed in your system (very often package is called esound))

((3)Now sound in KDE is mixed with sound from alsa driven apps without need to use (almost always not working) artsdsp.) (3)Maintenant le son dans KDE est mélangé avec le son des applications pilotées par alsa, sans qu'il soit nécessaire d'utiliser (qui la plupart du temps ne marche pas) artsdsp.

[modifier] Credits

maHo

[modifier] OSS Approach

  • ((1)Setup alsa-oss.)
  • ((2)Rename /usr/kde/3.1/bin/artsd in to /usr/kde/3.1/bin/artsd.orig.)
  • (1)Configuration de alsa-oss
  • (2)Renommer /usr/kde/3.1/bin/artsd en /usr/kde/3.1/bin/artsd.orig.
# mv /usr/kde/3.1/bin/artsd  /usr/kde/3.1/bin/artsd.orig

In the file /usr/kde/3.1/bin/artsd add:

File: /usr/kde/3.1/bin/artsd

#!/bin/sh
aoss artsd.orig $*

  • make it executable (!).
#chmod +x /usr/kde/3.1/bin/artsd

=>KDE Control Center=>arts=> choose Threaded OSS (!) as your sound system, it wouldn't work with the others one. As of Kde 3.2.3 you can also use alsa output here.

[modifier] Credits

Zoltan (Note: Russian language post)

[modifier] esound

Recent releases of esound support alsa plug in hw devices, so if your gnome apps, or some binary apps, could easily work with esound, and you don't care about latency, esound can play out to dmix, which works nicely.

Make sure that your esd uses alsa, and add -d default option to /etc/esd/esd.conf.

File: /etc/esd/esd.conf
[esd]
auto_spawn=1
spawn_options=-terminate -nobeeps -as 2 -d default
spawn_wait_ms=100

If you notice that esd doesn't want to play through default device, or if you launch esd -d default, it segfaults, it means that you have esound<=0.2.32, which use obsolete alsa API. If it's true, install more recent, or compile latest esound with esound-alsa-pcm-newapi.patch

[modifier] Credits

maHo
fafhrd

[modifier] polypaudio

Edit /etc/polypaudio/defaults.pa, so that all lines containing module-alsa-sink also contain device=dmix (dmix, or whatever the muxing device in your .asoundrc is). Example config file:

#!/usr/bin/polypaudio -nF 

#
# This file is part of polypaudio.
#
# polypaudio is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# polypaudio is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with polypaudio; if not, write to the Free Software Foundation,
# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.


# Load audio drivers statically

#load-module module-alsa-sink sink device=dmix
#load-module module-alsa-source device=plughw:1,0
#load-module module-oss device="/dev/dsp" sink_name=output source_name=input
#load-module module-oss-mmap device="/dev/dsp" sink_name=output source_name=input
load-module module-null-sink
#load-module module-pipe-sink

# Load audio drivers automatically on access

# ALSA
add-autoload-sink output module-alsa-sink sink_name=output device=dmix
add-autoload-source input module-alsa-source source_name=input

# OSS
add-autoload-sink output module-oss device="/dev/dsp" sink_name=output source_name=input
add-autoload-source input module-oss device="/dev/dsp" source_name=input sink_name=output

#add-autoload-sink output module-oss-mmap device="/dev/dsp" sink_name=output source_name=input
#add-autoload-source input module-oss-mmap device="/dev/dsp" sink_name=output source_name=input

# Load several protocols
load-module module-esound-protocol-unix
#load-module module-esound-protocol-tcp
load-module module-native-protocol-unix
#load-module module-simple-protocol-tcp
#load-module module-cli-protocol-unix

# Load the CLI module
load-module module-cli

# Make some devices default
set-default-sink output
set-default-source input

.nofail

# Load something to the sample cache
load-sample x11-bell /usr/share/sounds/generic.wav
#load-sample-dir-lazy /usr/share/sounds/*.wav

# Load X11 bell module
load-module module-x11-bell sample=x11-bell sink=output

# Publish connection data in the X11 root window
load-module module-x11-publish

#load-module module-pipe-source
#load-module module-pipe-sink

[modifier] MPlayer

Si vous avez activé alsa à la compilation (avec la variable USE) vous pouvez éditer /etc/mplayer.conf à la ligne où vous voyez ao=oss pour la remplacer par:

File: /etc/mplayer.conf

ao=alsa

ou lancer simplement mplayer comme ceci:

# mplayer -ao alsa movie.avi

※vous devriez lancer cette commande d'abord

# mplayer -ao help

vous verez tous les paramètres de sortie audio, this will more correct when you assign the -ao parameter. Note: the syntax for using alsa with mplayer has changed with newer versions of mplayer. For the 1.0_pre4 series you will need to use "alsa1x:default" instead of "alsa9:default". Starting with 1.0_pre5 you need to simply use "alsa:device=dmix".

Note: In mplayer it is possible to convert audio sample rates using the -srate flag. Or you can edit your mplayer config file (/etc/mplayer.conf, or ~/.mplayer/config) and add the line srate=X (X being the rate defined in .asoundrc).

The period_size and buffer_size in ~/.asoundrc should be set to

File: ~/.asoundrc

...

pcm.dmixer  { 
    type dmix 
    ipc_key 1024 
    slave { 
        pcm "hw:0,0" 
        period_time 0 
        period_size 1024  <===== here
        buffer_size 8192  <===== and here
        periods 128 
        rate 44100 
    } 
    bindings { 
        0 0 
        1 1 
    } 
}

...

it's kinda magic numbers to allow mplayer work properly

[modifier] Credits

Redeeman
00420
00420
Zoltan (Note: Russian language forum.)

[modifier] XMMS

Options->Preferences

  • Select Alsa Plugin
  • Configure
    1. Audio Device: "dmixer" (per example conf above) which is the same as "ossmix"
    2. Use software volume control (i don't want making music louder to raise gAIM sounds!)
    3. mixer device and mixer card are greyed out for me
    4. Advanced Setting (these settings maybe for a particular sound card)
      • buffer time: 750ms
      • period time: 75ms
      • uncheck mmap mode

[modifier] Credits

First seen on http://forums.gentoo.org, original post by fafhrd

[modifier] GAIM

Tools->Preferences->Sounds->Sound Command =
aplay -D plug:dmix %s

[modifier] Credits

First seen on http://forums.gentoo.org, original post by fafhrd

[modifier] Firefox, Mozilla, RealPlayer, Skype & Co

To make its plugins (especially libflashplayer.so) use dmix through aoss:

  • Move the original firefox softlink
# rm /usr/bin/firefox
# ln -s /usr/libexec/mozilla-launcher /usr/libexec/firefox
  • Create a new executable script:

Sorry, it was wrong initially - now it works with any commandline options

File: /usr/bin/firefox (corrected)
#!/bin/sh

# not correct:
#aoss /usr/libexec/firefox $*
#
# correct:
aoss /usr/libexec/firefox "$@"

In a similar fashion it is also possible to "dmix" other oss apps like:

  • gflashplayer
  • realplayer
  • skype
  • mozilla (suite)

This way one can have, say, several tabs with flash all sounding together and receive an incoming call or system sounds.

For example:

# rm /usr/bin/skype
# touch /usr/bin/skype
# chmod +x /usr/bin/skype

and its contents:

File: /usr/bin/skype
#!/bin/sh
aoss /opt/skype/skype "$@"

Even more - if You do this wisely, there is no need to edit any menus or preferences (like "default browser").

piesis

[modifier] LICQ

Set to use aplay in preferences.

[modifier] SDL

Set environment with:

File: /etc/env.d/99sdl
SDL_AUDIODRIVER=alsa 
AUDIODEV=default

ATTENTION: setting AUDIODEV can cause a non working Mozilla! :-/

[modifier] Credits

Zoltan (Note: Russian language forum.)

[modifier] gstreamer

Emerge gnome-media, then run gstreamer-properties and set your Audio-Sink. Output is Custom. Pipeline is alsasink device=dmixer (or device=ossmixer, if that's what you used in your asoundrc, or simply device=dmix if you didn't edit it)

(Hint: rhythmbox uses gstreamer)

[modifier] Hardware config - asoundrc files

First look at http://www.alsa-project.org/alsa-doc and choose your sound card Card Specific Scripts can be found at The Alsa Project.

For local settings edit ~/.asoundrc, for global settings go to /etc/asound.conf


[modifier] intel8x0 audio card integrated on nforce2 motherboards

Note: For kernel 2.4, alsa needs to be emerged separately, while for kernel 2.6+ alsa is included with the kernel. Make sure you select the snd_intel8x0 module while configuring your kernel.

File: ~/.asoundrc
# Set default sound card
# Useful so that all settings can be changed to a different card here.
pcm.snd_card {
     type hw
     card 0
}

# Allow mixing of multiple output streams to this device
pcm.dmix {
     type dmix
     ipc_key 1024
     slave.pcm "snd_card"
     slave {
          # This stuff provides some fixes for latency issues.
          # buffer_size should be set for your audio chipset.
          period_time 0
          period_size 1024
          buffer_size 8192
     }

     bindings {
          0 0
          1 1
     }
}

# Allow reading from the default device.
# Also known as record or capture.
pcm.dsnoop {
     type dsnoop
     ipc_key 2048
     slave.pcm "snd_card"

## Possible artsd full duplex fix:
#     slave {
#          period_time 0
#          period_size 1024
#          buffer_size 8192
#     }

     bindings {
          0 0
          1 1
     }
}

# This is what we want as our default device
# a fully duplex (read/write) audio device.
pcm.duplex {
     type asym
     playback.pcm "dmix"
     capture.pcm "dsnoop"
}

###################
# CONVERSION PLUG #
###################
# Setting the default pcm device allows the conversion
# rate to be selected on the fly.
# duplex mode allows any alsa enabled app to read/write
# to the dmix plug (Fixes a problem with wine).
pcm.!default {
     type plug
     slave.pcm "duplex"
}

# Apparently this is wrong (breaks mplayer for me opening the device)
#ctl.!default {
#     type plug
#     slave.pcm "snd_card"
#}

########
# AOSS #
########
# OSS dsp0 device (OSS needs only output support, duplex will break some stuff)
pcm.dsp0 {
     type plug
     slave.pcm "dmix"
}

# OSS control for dsp0 (needed?...this might not be useful)
ctl.dsp0 {
     type plug
     slave.pcm "snd_card"
}

# OSS control for dsp0 (default old OSS is mixer0)
ctl.mixer0 {
     type plug
     slave.pcm "snd_card"
}


This is working ok in a centrino notebook. The only problem is that artsd crashes as soon as the green button (call button) is pressed under skype. My guess is that the full-duplex part is missing.

[modifier] Credits

allex87
intel8x0

[modifier] via82cxxx onboard/ICE1712 chip

If config does not work (well) with an Audiophile card (ICE1712 chip) or a VIA VT82xx (snd-via82xx). The error is:

$ alsaplayer -d ossmix
error on set_format SND_PCM_FORMAT_S16_LE
Unavailable hw params:
ACCESS:  RW_INTERLEAVED
FORMAT:  S32_LE
SUBFORMAT:  ALL
SAMPLE_BITS: ALL
FRAME_BITS: ALL
CHANNELS: 2
RATE: 48000
PERIOD_TIME: (21333 21334)
PERIOD_SIZE: 1024
PERIOD_BYTES: ALL
PERIODS: (6 7)
BUFFER_TIME: (136520 136521)
BUFFER_SIZE: 6553        <<<<====take a look here!!
BUFFER_BYTES: ALL
TICK_TIME: ALL

Jaroslav Kysela did know the reason: The max buffer size of the Delta card is "6553" as marked above. So we need to specify a buffer size in our dmix definition that is: a) a power of two and b) less than 6553. Here's the fixed OSS-dmix .asoundrc for a ICE1712 and VT82xx card:

File: ~/.asoundrc
# ~/.asoundrc

# our ICE1712 dmix:
pcm.ossmix {
    type dmix
    ipc_key 1024
    slave {
        pcm "hw:0,0"
        period_time 0
        period_size 1024
        buffer_size 4096        # buffer size < 6653, but pow(x, 2)
        rate 44100              # we want to play CDs only
    }

    bindings {
        0 0
                1 1
        }
}

# Everything shall be dmixed, so redefine "default":
pcm.!default {
    type plug
    slave.pcm "ossmix"
}

# OSS via aoss should d(mix)stroyed:
pcm.dsp0 {
    type plug
    slave.pcm "ossmix"
}

ctl.mixer0 {
    type hw
    card 0
}

[modifier] Credits

http://alsa.opensrc.org/index.php?page=DmixPlugin

[modifier] cmedia 8738 and Analog Devices AD1980

File: /etc/modules.d/alsa

...
alias snd-card-0 snd-cmipci
...

File: ~/.asoundrc
pcm.dmixer { 
    type dmix 
    ipc_key 1024 
    slave { 
        pcm "hw:0,0" 
        period_time 0 
        period_size 1024 
        buffer_size 8192 
   rate 44100 
    } 
    bindings { 
        0 0 
        1 1 
    } 
} 

pcm.dsp0 { 
    type plug 
    slave.pcm "dmixer" 
} 

pcm.!default { 
        type plug 
        slave.pcm "dmixer" 
} 

pcm.default { 
   type plug 
   slave.pcm "dmixer" 
} 

ctl.mixer0 { 
    type hw 
    card 0 
}

[modifier] Credits

Redeeman

[modifier] Troubleshooting

[modifier] Alsa + dmix + microphone

  • Q: I can play many sound at the same time but I can't record any sound using arecord:
$ arecord -f cd -d 3 -t wav -N test.wav 
ALSA lib pcm_dmix.c:759:(snd_pcm_dmix_open) The dmix plugin supports only playback stream 
arecord: main:502: audio open error: Invalid argument

But when I remove my ~/.asoundrc I can record.
How can I fix this ?

  • A: Use dsnoop, scan the page for a ~/.asoundrc with it

[modifier] XMMS in KDE

KDE sounds and media players work, but XMMS says device is busy. This means that arts output isn't redirected to dmix, look at the arts section.

[modifier] Enregistrer du son

  • Q: Tout semble marcher: je peux ecouter du son, quand je parle dans le micro, le son est renvoyé dans les hauts parleurs, mais... pas moyen d'enregistrer!
  • R: En lisant le manuel de krec, il est expliqué qu'il faut lancer le "sound system" en mode full duplex.

Remarque: désolé de ne pas mettre plus de détails. Après des heures de recherches sur les forums, j'ai enfin fait marcher l'enregistrement du son (et skype) en mettant mon serveur son (sous kde) en mode full-duplex.

[modifier] Feedback

Autres langues