Newsgroup: it.comp.os.linux.iniziare
Titolo: dubbio su audio in Linux

Più che altro per curiosità sto cercando di avere un'idea di come "funzioni" 
l'audio sotto Linux.
Spulciando quà e là su qualche sito e leggendo vecchi post, sono giunto alle 
seguenti conclusioni:
1) ALSA (o OSS) agiscono al più basso livello interfecciandosi direttamente, 
tramite i moduli per il kernel, con l'hardware mettendo a disposizione una 
serie di API e i device /dev/dsp e /dev/mixer
2) con solo ALSA (o OSS) un solo programma per volta potrebbe aver accesso a 
tali periferiche per cui finchè, ad esempio, un player MP3 stesse suonando 
della musica non sarebbe possibile sentire altri effetti audio
3) per risolvere tale problema si usa un "sound server" che si frappone fra 
le applicazioni e i device hardware multiplexando e demultiplexando le 
richieste in modo da permettere l'accesso "simultaneo" all'hardware.
Quello che non i è chiaro è come operi il sound server; così a intuito penso 
che vi sia un demone che intercetta le richieste fatte a /dev/dsp e le 
gestisca facendo credere al software di dialogare con il device, è corretto 
?
-- 
Matteo
"Ma se mai dovessi presentarti a casa mia con una telecamera, ti ucciderò."
Clint Eastwood a Michael Moore 

 ?
Qui cadi :)
I sound server fanno semplicemente da mixer software delle diverse
fonti che gli inviano audio, fonti che devono conoscere l'esistenza del
sound server, altrimenti ciccia. Ultimamente con l'implementazione di
un mixer software direttamente in ALSA (chiamato dmix) più programmi
(volendo anche più sound server a tempo) possono accedere in
contemporanea alla scheda audio. Prima di dmix o avevi una scheda audio
con mixer hw, o usavi un soundserver o, semplicemente, ti attaccavi :)

sound server, altrimenti ciccia. Ultimamente con l'implementazione di
Ah, quindi suppongo da qualche parte nei vari software bisogna impostare 
qualcosa per dirgli che c'è il sound server.
Appena ho tempo provo a guardare fra le impostazioni di XMMS; non è che mi 
puoi dare una dritta su cosa guardare? ^_^"


 puoi dare una dritta su cosa guardare? ^_^"
Devi installarti il plugin xmms-soundserver come xmms-esd, xmms-arts,
xmms-gstreamer, xmms-jack ecc ecc

 xmms-gstreamer, xmms-jack ecc ecc
Ah, quindi generalizzando ogni programma audio deve prevedere un 
plugin/client apposito con cui connettersi al sound server ?
-- 
Matteo
"Ma se mai dovessi presentarti a casa mia con una telecamera, ti ucciderň."



Yes.
Nel caso si usi ALSA, e il programma (che naturalmente deve supportare
ALSA) permetta l'impostazione del dispositivo, invece di "hw:0" o
"default" (che sono i nomi simbolici ALSA del primo dispositivo hardware
audio o quello di default definito in ~/.asoundrc) si puo` impostare
"pcm.ossmix", e avere il mixing in userspace (non a livello hardware, ma
funziona quasi sempre, magari c'e` da giocare un po' con i parametri in
~/.asoundrc) senza usare un soundserver.
Ad esempio, in xmms puoi usare il plugin d'uscita ALSA e come dispositivo
inserire "pcm.ossmix", invece di "default" o "hw:0".
Guarda pero` prima 
http://alsa.opensrc.org/index.php?page=DmixPlugin
e 
http://alsa.opensrc.org/index.php?page=asym
-- 
          salvuz
     POST FATA RESVRGO
 Linux registered user #291700 | machine #174619
 get counted on ---> 
http://counter.li.org/
 <---

 disposizione una serie di API e i device /dev/dsp e /dev/mixer
                                           ^^^^^^^^^^^^^^^^^^^^^
e /dev/midi. Questi dispositivi li crea OSS, o ALSA in emulazione OSS (non
puoi usare i driver OSS e ALSA insieme.)
Se usi solo ALSA (come dovrebbe essere la norma), oltre a questi device,
che crea quando carichi anche i moduli per l'emulazione OSS (moduli che
quasi sicuramente inserisci automaticamente quando inserisci i moduli
ALSA), che sono snd_pcm_oss (ed hai /dev/dsp), snd_mixer_oss (ed
hai /dev/mixer) e snd_seq_oss (ed hai /dev/midi), ALSA di suo crea dei
dispositivi 
 /dev/snd/hwC0D0, (che corrisponde al /dev/dsp di OSS)
 /dev/snd/pcmC0D0p e /dev/snd/pcmC0D0c (che credo non abbiano un
   corrispettivo OSS, puoi pensarli come un /dev/dsp aperto in scrittura,
   cioe' per il playback, e /dev/dsp aperto in lettura, cioe` per il
   capture)
 /dev/snd/midiC0D0 (che corrisponde al /dev/midi di OSS)
 /dev/snd/controlC0 (che corrisponde al /dev/mixer di OSS)
in piu' hai /dev/snd/seq /dev/snd/timer.


salvuz ha scritto:
[cut]
Dimenticavo: nelle applicazioni ALSA quasi mai dovrai specificare il device
ALSA da usare, piuttosto troverai il nome simbolico da inserire, e cioe`
hw:0, che e` il nome simbolico per /dev/snd/hwC0D0
in generale hw:x,y  --> /dev/snd/hwCxDy
dove C e' il card number , cioe` il numero della scheda (io ho 3 schede
audio ed ho C0, C1 e C2) e D e` il device number, se la scheda supporta
l'hardware mixing avrai piu` device in una sola scheda, quindi hwC0D0,
hwC0D1, hwC0D2, ecc, tutti nella card 0.


 hwC0D1, hwC0D2, ecc, tutti nella card 0.
Ecco, visto che tu sembri esperto, ma se hai una scheda che fa mix HW, ti
escono più device in /dev, giusto? quindi devi specificare nei diversi
programmi un device differente o si può usare sempre lo stesso con qualche
configurazione particolare di asoundrc magari?
-- 
Vide
"To emulate flesh machines I am learning" (Nevermore)
NP: Nulla

 
io ho:
salvuz@slack101-sal:/dev$ ls /dev/dsp*
/dev/dsp  /dev/dsp1  /dev/dsp2
salvuz@slack101-sal:/dev$ ls /dev/snd
(ho raggruppato e formattato un po'...)
controlC0 hwC0D0    midiC0D0          |
pcmC0D0c  pcmC0D0p  pcmC0D1c          | SBLive 0
pcmC0D2c  pcmC0D2p  pcmC0D3p          |
controlC1 hwC1D0    midiC1D0          |
pcmC1D0c  pcmC1D0p  pcmC1D1c          | SBLive 1
pcmC1D2c  pcmC1D2p  pcmC1D3c          |
controlC2 hwC2D0    midiC2D0          |
pcmC2D0c  pcmC2D0p                    | FM801 (un'altra scheda, 
                                      | senza hardware mixing)
seq timer                             |altri device di ALSA
La pluralita` dei device pcmCxDyc e pcmCxDycp nelle SBLive e` indicativa,
per quanto mi e` capitato sempre di vedere, di capacita` di mix in
hardware, ma con ALSA va usato sempre il nome "simbolico" del dispositivo
da usare. Questo perche` e` possibile creare dispositivi virtuali
(userspace, e` una cosa fornita da alsa-lib) con particolari
caratteristiche (ad esempio un dispositivo che presenta un filtro
passa-alto a 1000 Hz, o un dispositivo come dmix che effetua il
software-mixing in userspace) e usarli nelle applicazioni al posto di
"hw:0".
Di /dev/dsp (con OSS o OSS-emulation) o /dev/snd/hwCxDx (cona ALSA) ne hai
uno solo per scheda, anche se la scheda fa HWmixing. Nei programmi che
usano l'interfaccia OSS specificherai sempre /dev/dsp, e "default" o
"hw:0,0" in quelli che usano ALSA, dato che bisogna specificarne il nome
"simbolico". Con l'HWmixing un'altra applicazione che voglia aprire il
device in scrittura semplicemente non lo trova busy e funziona come se
niente fosse. (sulle mie SBLive credo si possa aprire /dev/dsp o hw:0 in
scrittura fino a 32 volte). Ci pensa il DSP sulla scheda a mixare gli
stream per poi mandarli al DAC, che e' in genere uno solo, a due canali,
ma possono essere anche due, come sulla SBLive (AC97 e I2S), che ha uscite
stereo front e rear (+ LFE o sub e centrale , ma credo siano il mix dei
due DAC con filtri, non sono sicuro).
Questo in playback.
In capture non c'e` hardware mixing neanche sulla Live, cioe` se sto
registrando con Audacity o tengo acceso JACK in modalita` full-duplex, non
posso anche registrare con ReZound, o sox, ecc, dato che il capture e`
occupato da JACK o Audacity.
Questo problema sul capture (che se non ricordo male esisteva o esiste
anche su Windows) si puo` risolvere con ALSA in .asoundrc con il plugin
dsnoop, che puo` essere aperto in lettura da piu` applicazioni ALSA, che
leggeranno (registreranno) chiaramente la stessa cosa.
Il plugin asym fonde dmix e dsnoop.
Sul WIKI di ALSA ci sono molte informazioni e cose da provare.
