2006-08-20
ALSA - grund(lig)kurs
För att få det mesta ut av den här texten, rekommenderar jag att du har ett Linux-system uppe redan, med en terminal inte alldeles för långt borta. Det går dock att läsa ändå, som tur är.
ALSA betyder som bekant Advanced Linux Sound Architecture och är själva fundamentet för att vi ska kunna ha något ljud över huvud taget i Linux.
ALSA är standardsystemet för alla Linux-kärnor av version 2.6.x och uppåt. Ska man vara riktigt petnoga blev det standard redan i 2.5. Alla Linux-versioner av någorlunda färskt datum inkluderar en 2.6.x-kärna, där x i skrivande stund kan vara alltifrån 0 till 18.
INSTALLATION
Jag kommer inte att gå in på hur man installerar ALSA i de olika distributionerna, det finns gott om dokumentation på nätet om hur man gör det om det inte finns installerat från start.
De distributioner som har alsa installerat från scratch är (bland många andra):
PROGRAM
I ALSA har man till sitt förfogande några små kommandobaserade program som kan vara bra att känna till. Jag kommer att gå igenom några av dessa mer i detalj lite längre ner:
ENHETER
I Linux är alla enheter en fil som man kan läsa från eller skriva till. Alla enheter återfinns i katalogen /dev. När du rör på musen i Linux ser operativsystemet detta som en dataström från musens enhetsfil som kan vara /dev/input/mice. /dev står för "devices". Tangentbordet har även det en enhetsfil och så även ljudkortet.
Skillnaden är att ljudkortet är en något mer komplex enhet, vilket gör att den har flera olika enheter (eller portar) för olika ändamål.
Ljudkortshanteringen i Linux är lite knepig. Till exempel är följande enheter egna ljudkort:
ALSA håller sina enhetsfiler i /dev/snd/-katalogen, och de är uppbyggda på följande sätt:

Figur 1: 4-bitars Pulskodsmodulering av analog signal (röda kurvan)
Det finns en enhet: pcmC0D0, som har både en playback(uppspelnings)-ström och en capture(inspelnings)-ström. Så kan det vara. Andra enheter har bara en playback-ström eller en capture-ström, eller flera av varje.
Vid första anblicken kan det vara svårt att förstå vilken enhet som är vad på ljudkortet. Till och med vid den andra anblicken. För att vara helt ärlig så är det smått omöjligt att utröna vad som är vad bara genom att kolla i katalogen /dev/snd.
PROC
Därför finns det hjälp att få i det virtuella filsystemet i /proc/asound/-katalogen. Proc är ett speciellt bibliotek, detta bibliotek är inte del av det riktiga filsystemet, utan är ett virtuellt filsystem där man kommer åt information som Linux-kärnan vill att du ska kunna komma åt, exempelvis vilken processor du har. Det går även att skicka information till Linux-kärnan genom /proc-filsystemet. De filer man kan ha hjälp av i sammanhanget är:
cat /proc/asound/cards
för att få en något kryptisk lista över vilka ljudkort som finns på datorn. Man kan även gå in i katalogen /proc/asound och lista filer med cat, det kommer inte att skada något mer än möjligen din självkänsla.
PROGRAMMEN igen
alsamixer

Figur 2: Alsamixers gränssnitt
Det första programmet vi ska ta en titt på är alsamixer. Vid start kan programmet ta ett antal parametrar varav -c [ljudkortsnummer] är den viktigaste. Här kan man specificera vilket ljudkort som skall kontrolleras. Om man har flera ljudkort, alltså, som USB-mikrofoner eller dylikt. Då skriver man:
alsamixer -c 1
för att få det andra ljudkortets inställningar. Detta eftersom nördar gillar att börja räkna från 0. Väl i programmet kan man använda följande tangenter för att navigera runt:
arecord
Detta är det simplaste inspelningsprogram som du kommer att stöta på, någonsin. Inte till sin användning, utan till sin utrustning. Det kan sampla i många format, men det är också allt man kan göra med det. Syntaxen är:
arecord -D [device] -f [format] -d [duration] file
och det är här detaljkunskapen om ALSA kommer till sin rätt, första gången. För att lista vilka enheter vi har till vårt förfogande att spela in på, skriver vi kommandot:
arecord --list-devices
För att spela in på den första inspelnings-enheten (Card 0, Device 0) i CD-kvalitet (44,1kHz, 16-bitar, stereo) i tjugo sekunder till filen test.wav skriver vi:
arecord -D hw:0,0 -f cd -d 20 test.wav
Det är inte snyggt, och det är inte lättanvänt, men det är bra att kunna när det skiter sig i det blå skåpet. Kommandot arecord --help ger en sammanfattning av hur man använder arecord.
aplay
För att spela upp vårt mästerverk använder vi aplay. Det har i princip samma syntax som arecord, så för att spela upp filen test.wav skriver vi:
aplay -D hw:0,0 -f cd test.wav
Vi kunde lagt med -d 20 också, men utan den parametern spelar den hela filen tills den är färdig. Notera att vi använder samma enhet: hw:0,0, men nu använder ALSA playback-strömmen istället för capture-strömmen.
För de andra programmens olika parametrar och användningsområden, föreslår jag deras manual-pages, som kan hittas genom att skriva, i tur och ordning:
man aplaymidi
man arecordmidi
man aseqdump
man aconnect
man speaker-test
Detta kommando fungerar givetvis med de program som redan redovisats också.
Lycka till!
ALSA betyder som bekant Advanced Linux Sound Architecture och är själva fundamentet för att vi ska kunna ha något ljud över huvud taget i Linux.
ALSA är standardsystemet för alla Linux-kärnor av version 2.6.x och uppåt. Ska man vara riktigt petnoga blev det standard redan i 2.5. Alla Linux-versioner av någorlunda färskt datum inkluderar en 2.6.x-kärna, där x i skrivande stund kan vara alltifrån 0 till 18.
INSTALLATION
Jag kommer inte att gå in på hur man installerar ALSA i de olika distributionerna, det finns gott om dokumentation på nätet om hur man gör det om det inte finns installerat från start.
De distributioner som har alsa installerat från scratch är (bland många andra):
- Ubuntu Breezy (5.10) / Dapper (6.06)
- Fedora Core 2, 3, 4 och 5
- SuSE 9, 10 osv.
PROGRAM
I ALSA har man till sitt förfogande några små kommandobaserade program som kan vara bra att känna till. Jag kommer att gå igenom några av dessa mer i detalj lite längre ner:
- alsamixer - en fönsterbaserad mixer i textmode med staplar för volymen på de olika enheterna
- arecord - ett inspelningsprogram
- aplay - ett uppspelningsprogram
- aplaymidi - ett uppspelningsprogram för MIDI-filer
- arecordmidi - ett inspelningsprogram för MIDI-filer
- aconnect - ett program för att koppla samman olika sequencers
- aseqdump - visar MIDI-events som mottas på en viss sequencerport
- speaker-test - genererar toner för att testa högtalare i ALSA
ENHETER
I Linux är alla enheter en fil som man kan läsa från eller skriva till. Alla enheter återfinns i katalogen /dev. När du rör på musen i Linux ser operativsystemet detta som en dataström från musens enhetsfil som kan vara /dev/input/mice. /dev står för "devices". Tangentbordet har även det en enhetsfil och så även ljudkortet.
Skillnaden är att ljudkortet är en något mer komplex enhet, vilket gör att den har flera olika enheter (eller portar) för olika ändamål.
Ljudkortshanteringen i Linux är lite knepig. Till exempel är följande enheter egna ljudkort:
- USB-mikrofoner
- Klaviatur av USB-MIDI-modell
- Externa USB-ljudkort (föga förvånande, men i alla fall..)
- andra ljudenheter som jag inte tänkt på.
ALSA håller sina enhetsfiler i /dev/snd/-katalogen, och de är uppbyggda på följande sätt:
- För varje installerat ljudkort i datorn finns det en kontroll/mixer-fil. Det finns undantagsfall, men dessa återkommer jag till.
- Alla ljudkort som hanterar in- och utgående ljudströmmar har playback- och capture-filer.
- Ljudkort med MIDI-enheter har en sequencer-fil.
- Ljudkort med MIDI-enheter har även en eller flera MIDI-enhets-filer.
- Alla ljudsystem har en timer-fil.
- /controlC0 - control Card 0. Kontroll/mixer-fil för det första ljudkortet.
- /pcmC0D0c - pulse code modulation Card 0 Device 0 capture. Den första enheten på det första ljudkortet. Bara för inspelning.
- /pcmC0D0p - pulse code modulation Card 0 Device 0 playback. Den första enheten på det första ljudkortet. Bara för uppspelning.
- /pcmC0D1c - Den andra enheten på det första ljudkortet. För inspelning.
- /pcmC0D2c - Den tredje enheten på det första ljudkortet. För inspelning.
- /pcmC0D3c - Den fjärde enheten på det första ljudkortet. För inspelning.
- /pcmC0D4p - Den femte enheten på det första ljudkortet. För uppspelning.
- /seq - Sequencer-filen för MIDI-systemet.
- /timer - Helt otippat är detta timern för ljudsystemet.

Figur 1: 4-bitars Pulskodsmodulering av analog signal (röda kurvan)
Det finns en enhet: pcmC0D0, som har både en playback(uppspelnings)-ström och en capture(inspelnings)-ström. Så kan det vara. Andra enheter har bara en playback-ström eller en capture-ström, eller flera av varje.
Vid första anblicken kan det vara svårt att förstå vilken enhet som är vad på ljudkortet. Till och med vid den andra anblicken. För att vara helt ärlig så är det smått omöjligt att utröna vad som är vad bara genom att kolla i katalogen /dev/snd.
PROC
Därför finns det hjälp att få i det virtuella filsystemet i /proc/asound/-katalogen. Proc är ett speciellt bibliotek, detta bibliotek är inte del av det riktiga filsystemet, utan är ett virtuellt filsystem där man kommer åt information som Linux-kärnan vill att du ska kunna komma åt, exempelvis vilken processor du har. Det går även att skicka information till Linux-kärnan genom /proc-filsystemet. De filer man kan ha hjälp av i sammanhanget är:
- /proc/asound/cards - visar kort information om alla ljudkort som finns installerade på datorn.
- /proc/asound/pcm - visar de PCM-enheter som finns i systemet i formen
CC-DD: Tillverkare : Enhetsnamn : [uppspelning : inspelning] - /proc/asound/modules - visar de moduler som är laddade för att ljudkortet ska fungera.
- /proc/asound/seq/drivers - visar de moduler som är laddade för att MIDI ska fungera.
- /proc/asound/card0/ - katalog som innehåller information om det första ljudkortet på datorn.
cat /proc/asound/cards
för att få en något kryptisk lista över vilka ljudkort som finns på datorn. Man kan även gå in i katalogen /proc/asound och lista filer med cat, det kommer inte att skada något mer än möjligen din självkänsla.
PROGRAMMEN igen
alsamixer

Figur 2: Alsamixers gränssnitt
Det första programmet vi ska ta en titt på är alsamixer. Vid start kan programmet ta ett antal parametrar varav -c [ljudkortsnummer] är den viktigaste. Här kan man specificera vilket ljudkort som skall kontrolleras. Om man har flera ljudkort, alltså, som USB-mikrofoner eller dylikt. Då skriver man:
alsamixer -c 1
för att få det andra ljudkortets inställningar. Detta eftersom nördar gillar att börja räkna från 0. Väl i programmet kan man använda följande tangenter för att navigera runt:
- pil-upp och pil-ner för att ändra volym
- pil-höger/pil-vänster för att byta stapel
- F4 för att bara visa inspelnings-kontroller
- M för att stänga av/slå på ljudet på en kanal
- [space] för att slå på/slå av default capture på vald kanal
- F2 för att lista relevant information från /proc-katalogen
- F3 för att bara visa uppspelnings-kontroller
- F5 för att visa alla tillgängliga kontroller
- Esc för att avsluta programmet
arecord
Detta är det simplaste inspelningsprogram som du kommer att stöta på, någonsin. Inte till sin användning, utan till sin utrustning. Det kan sampla i många format, men det är också allt man kan göra med det. Syntaxen är:
arecord -D [device] -f [format] -d [duration] file
och det är här detaljkunskapen om ALSA kommer till sin rätt, första gången. För att lista vilka enheter vi har till vårt förfogande att spela in på, skriver vi kommandot:
arecord --list-devices
För att spela in på den första inspelnings-enheten (Card 0, Device 0) i CD-kvalitet (44,1kHz, 16-bitar, stereo) i tjugo sekunder till filen test.wav skriver vi:
arecord -D hw:0,0 -f cd -d 20 test.wav
Det är inte snyggt, och det är inte lättanvänt, men det är bra att kunna när det skiter sig i det blå skåpet. Kommandot arecord --help ger en sammanfattning av hur man använder arecord.
aplay
För att spela upp vårt mästerverk använder vi aplay. Det har i princip samma syntax som arecord, så för att spela upp filen test.wav skriver vi:
aplay -D hw:0,0 -f cd test.wav
Vi kunde lagt med -d 20 också, men utan den parametern spelar den hela filen tills den är färdig. Notera att vi använder samma enhet: hw:0,0, men nu använder ALSA playback-strömmen istället för capture-strömmen.
För de andra programmens olika parametrar och användningsområden, föreslår jag deras manual-pages, som kan hittas genom att skriva, i tur och ordning:
man aplaymidi
man arecordmidi
man aseqdump
man aconnect
man speaker-test
Detta kommando fungerar givetvis med de program som redan redovisats också.
Lycka till!