ALSA - Advanced Linux Sound Arcitecture

teejuht

                            1. Sissejuhatus
                            2. Kompilleerimine
                            3. Alsa Utils
                            4. Seadmed
                            5. Tähelepanuväärsed programmid

1. Sissejuhatus

Esmalt olgu üteldud, et minu kogemus põhineb helikaardil Creative Labs SoundBlaste PCI 64 kiviga es1370 ja see kogemus on positiivne :). Kernel 2.0.36. Sealt ma soundi asju üldse ei puutunud. Ainult enablesin module support'i.

Isegi positiivsem kui sama kaardi kasutamine kerneli 2.2.3 driveritega: seal ta kah töötab aga ainult ühe Pulse Coded Modulation (PCM) seadmega (/dev/pcm0).
 
 

2. Kompileerimine

Esmalt hankige endale viimased versioonid ftp://alsa.jcu.cz/pub (või http://alsa.jcu.cz) ning installeerige toodud järjekorras:

1. alsa-driver-0.3.0-pre4.tar.gz
2. alsa-lib-0.3.0pre4.tar.gz
3. alsa-utils-0.3.0-pre3.tar.gz
 

Mis toimub on:

1. alsa-driver-0.3.0-pre4.tar.gz

Installeeritakse driverid st. kerneli moodulid. seal tuleb teha kindlasti ka './snddevices' mis lood /dev/'i alsa'le spetsiifilised nö. seadmed.

2. alsa-lib-0.3.0pre4.tar.gz

library'd: need on asjad mis oskavad suhelda alsa driveritega; nendega aga suhtlevad omakorda programmid mis kasutaja käivitab.

bash# ldd /usr/bin/arecord
        libasound.so.0 => /usr/lib/libasound.so.0 (0x4000b000)
        libc.so.5 => /lib/libc.so.5 (0x40014000)
bash# ldd /usr/bin/aplay
        libasound.so.0 => /usr/lib/libasound.so.0 (0x4000b000)
        libc.so.5 => /lib/libc.so.5 (0x40014000)
bash# ldd /usr/bin/alsamixer
        libasound.so.0 => /usr/lib/libasound.so.0 (0x4000b000)
        libncurses.so.4 => /usr/lib/libncurses.so.4 (0x40014000)
        libc.so.5 => /lib/libc.so.5 (0x40053000)
bash# ldd /usr/bin/amixer
        libasound.so.0 => /usr/lib/libasound.so.0 (0x4000b000)
        libg++.so.27 => /usr/lib/libg++.so.27 (0x40014000)
        libstdc++.so.27 => /usr/lib/libstdc++.so.27 (0x4004c000)
        libm.so.5 => /lib/libm.so.5 (0x4007e000)
        libc.so.5 => /lib/libc.so.5 (0x40086000)
bash#
 

3. alsa-utils-0.3.0-pre3.tar.gz
 

3. Alsa -Utils

Enne kui saab asju kasutama hakata on vaja moodulid laadida:

Installeerimise aja tõstetakse nad /lib/modules/misc'ssi teiste moodulite juurde. Ja nad laaditakse modprobega. Mina teen seda rc.localist nii:

modprobe snd-audiopci
modprobe snd-pcm1-oss
alsactl restore
/usr/local/bin/mpg123 /etc/rc.d/pala.mp3 > /dev/null 2>&1 &

ning lsmod'iga vaadates avaneb järgmine pilt:

bash# lsmod
Module:        #pages:  Used by:
ppp                5            0
serial             7            1
slhc               2    [ppp]   0
snd-pcm1-oss       4            0
snd-audiopci       1            1
snd-ens1370        3    [snd-audiopci]  0
snd-ac97-codec     3    [snd-ens1370]   0
snd-pcm1           4    [snd-pcm1-oss snd-ens1370]      0
snd-midi           4    [snd-audiopci snd-ens1370]      0
snd-mixer          4    [snd-pcm1-oss snd-audiopci snd-ens1370 snd-ac97-codec]  1
snd-pcm            3    [snd-pcm1-oss snd-audiopci snd-pcm1]    0
snd                9    [snd-pcm1-oss snd-audiopci snd-ens1370 snd-ac97-codec snd-pcm1 snd-midisnd-mixer  snd-pcm]   1
bash#

Tõsi, neid ridu vaadates jääb küll mulje, et midi't peaks saama mängida ka kuidagi otse ilma timidity'ta. Aga midi'id teevad nii kui nii enamasti nii ebaloomulikku häält et neid vist harva mängitakse. Vähemalt minu kogemuse ja arvamuse põhjal :)
 

Heliga manipuleerimine

komplekti kuulub viis programmi (amixer, alsamixer, alsactl, aplay, arecord):
 

mikser

alsamixer
amixer (käsurea variant, kasutada nt. scriptidest)

Need on vastavalt ncurses ja käsurea utiliit seadmaks erinevaid helikaardi seadmeid (

sisendid välismaailmast:
line in - sisend nt. magnetofoni või grammofoni väljundist. Sinna võib pista tolle juhtme mis muidu läheb võimendisse.
mic -  mikrofon

sisendid arvuti poolt:
cd - eeldab, et ühendate juhtme CD ja helikaardi vahel (ta tuleb panna helikaardi pistikupesadepoolsemaisse pistikupessa, vist)
pcm0 - sellesse võib saata nt. mpg123 või aplay väljundi:

bash# mpg123 -a  /dev/dsp  heli.mp3

pcm1 - samaaegselt võib veel panna teise pala mängima

bash# mpg123 -a  /dev/adsp  heli.mp3
 

Miksriga on see lugu, et vaikimisi on kõik valjused maha keeratud. Nii, et värskelt alsa asjad peale pannes ning pala mängides te ei kuule jah midagi. Kasutage mixerit!

Näpunäited:

alsamixer on umbes selline:
 

                                             AlsaMixer v0.9

Card: Ensoniq AudioPCI
Chip Asahi Kasei AK4531

                                                          RECORD
               MM                                         L    R
  ##           ##                     ##         ##         #        ##     ##        ##       ##
  ##           ##                     ##         ##         #        ##     ##        ##       ##
  ##           ##                     ##         ##         ##       ##     ##        ##       ##
  ##           ##                     ##         ##         ##       ##     ##        ##       ##
  ##           ##                     ##         ##         ##       ##     ##        ##       ##
  ##           ##                     ##         ##         ##       ##     ##        ##       ##
  ##           ##                     ##         ##         ##       ##     ##        ##       ##
  ##           ##             ##      ##         ##         ##       ##     ##        ##       ##
  ##           ##             ##      ##         ##         ##       ##     ##        ##       ##
  ##           ##             ##      ##         ##         ##       ##     ##        ##       ##
92<>92        92<>92        92<>92   92<>92    92<>92     92<>82   92<>92  92<>92    92<>92   92<>92
master       master m         pcm     pcm1     line-in      mic      cd    mono1     mono2    aux a

Ja kuidas selline settting on seatud?

- nooltega (ehk n ja p) saab liikuda erinevate, ütleme soundi kaardi seadete vahel
- kummagi ja mõlema kanali valjust saab muuta q, w, e ja z, x, c 'ga.
- tühikuga saab 'toggle'da kas seade lindistab või mitte
- m'ga saab toggleda seadme mute'iks (tummaks)
- . ja , ga saab toggleda kumbagi kanalit mute'ks
 

kui miski seade lindistama panna siis asi salvestub kui käivitada 'arecord':

bash # arecord -w -m -t 10 file.wav

- w - tuleb nn. wav fail
-m sample rate 44100 kHz 16 bit PCM
- t aeg 10 sekundit

aga vaadake ise ka man'i ja -h'ga help'i!.
 
 

alsactl

see on selline asi, et võimaldab salvestada käesolevaid settinguid korraga ja neid peale keerata. Settinguid saab salvestada vaikimisi faili '/etc/asound.conf'

bash# alsactl store

ja lugeda nii:

bash# alsactl restore

viimane on tark panna koos soundi driveri moodulite laadimisega rc faili (nt. rc.local).
 

wav'i de taasesitamine:

bash# aplay -d /dev/dsp nimi.wav
 

4. Seadmed

Nendega on minu jaoks keeruline lugu :)

Aga põhimõtteliselt ei kasutata enam /dev/snd'd. Olulised on alsa puhul kataloogist /proc/asound allapoole jäävad asjad. Minu taedmist mööda minu es1370 kiviga kaardil pole mixerit peal. Niisiis, saan mängida kokkuvõttes ainult pcm (pulse coded modulation asju) mitte nt. midi'sid.

Ja nii toimub mpg123'ga mp3'sid mängides see, et programm dekodeerib mp3'le lahti pcm signaaliks mis saadetakse seadmesse /dev/dsp.

Või aplay'ga .wav'i taasesitades läheb info samuti /dev/dso'sse.

Ja programm timidity konverteerib midi'i faili käigult pcm'iks (st. wav'iks) ja saadetakse samasse seadmesse.

nii ka nsmod .mod failide jaoks.
 

5. Tähelpanuväärsed programmid

Kas nad nii vabalt alsa driveritega koos töötavad pole kindel, aga neist peaks teadlik olema:

sox  - The Swiss Army Knife of Sound Formats
wavplay
nsmod
mpg123 (o'ga - assembleris suuresti)
 
 

Ja mida ma ise tegin:

Oli probleem: teha vinüülplaatidest lood mp3'deks ja kirjutada cd'le. Siis hea kuulata, ei ole vaja pidevalt plaate vahetada kuigi ma pole just teab mis muusikamees. Ikkagi.

Olles salvestanud kolm plaati arecordiga lugu haaval ära (nb! cdparanoia extractib CD-ROM'ilt; grammofon on line-in'is) tuli tüdimus.

Ja siin ma tegin nii, et salvestasin mitu plaati üheks suureks failiks (ca 1 GB) PCM signaaliga (see on vist sama mis wav).

Ning hakkasin seada sellise C jupiga lõikuma:
 

#include <stdio.h>
struct rec
    {
    char x;
     };
main(int argc, char *argv[])
 {
   int i,j, b;
   FILE *f1, *f2;
   struct rec r;
   b=atoi(argv[2]);
   f1=fopen(argv[1],"r");
   f2=fopen(argv[3],"w");
   fseek(f1,b,SEEK_END);
   fseek(f2,0,SEEK_SET);
   while (fread(&r,sizeof(struct rec),1,f1) == 1)
     {
       fwrite(&r,sizeof(struct rec),1,f2);
     }
   fclose(f1);
   fclose(f2);
  }

See konkreetne asi töötab nii, et

bash# loikaja.b orig.wav -1000000 lugu.1.wav

ning tulemusena on orig.wav'ist viimane 1MB kopeeritud faili lugu.1.wav

Eks tule asja natuke veel sättida.

Ja muidugi tekib küsimus, et kuidas teada millise baidi peal on esimese ja teise loo vahe ja millise peal teise ja kolmanda vahe jne.

Seda saab kindlaks teha kui seda orig.wav'i soxiga kuulata. sox'i sourcesse on vaja kirjutada 'ühte kohta juurde

'printf("tere%d", arv)'

ning ta trükib mängimise ajal ekraanile numbreid. Lugude pauside ajal on vaja need üles märkida ja siinneid kasutada.

See koht kuhu see print kirjutada tuleb on selline:

sox.c

funktsioon process {}

wav'i faili ime on vist see, et teada võib tükeldada nii kuis süda ihkab (tõenäoliselt paarisarvuliselt või neljaga jaguvate pikkuste pealt) ning kui saata /dev/dsp'sse, siis ikka töötab.

wav'idel on 44 B suurune päis mille tähendust pole ma saanud kindalks teha. Kuid eks te ise proovige, abiks on programm 'od'.

gggg