Linux & zvukove karty

Zvukovych karet je dnes mnoho typu. Lisi se predevsim technologii prehravani a tim i vytvareni vysledneho zvuku.

Prvnim typem jsou karty kompatibilni se SoundBlastrem. Karty jsou standartne vybaveny FM cipem alespon verze OPL-2. Zvuk vznika PCM - pulsni modulaci - zvuk je sniman/prehravan v tzv. samplech (8 nebo 16 bit ) a ty jsou pote ruznou rychlosti ( 5000-44100 Hz, mono/stereo ) prehravany. FM cip slouzi k vytvareni zvuku pomoci frekvencni modulace - mame dva (OPL-2) nebo ctyri( OPL-3) operatory nejcasteji se sinovym prubehem, ktere bud scitame nebo jeden druhym moduluje.

Na podobnem principu pracuji karty Gravis. Rozdil spociva v tom, ze maji vlastni pamet, ve ktere jsou ulozeny samply nastroju a ty dokazi prehravat s ruznymi efekty ve 32 kanalech. Jsou take schopny nahravani/prehravani jako SB. Jsou vhodne jako prehravajici midi zarizeni.

Poslednim typem jsou MIDI karty - slouzi k pripojeni MIDI zarizeni bud pro vstup nebo vystup. To znamena, ze pocitac muze jednak zaznamenavat prehravanou skladbu a zaroven ji prehravat. V podstate SB i Gravis maji MIDI konektory.

Podporovane typy zvukovych karet

SB v1.0 a kompatibilni ( 8 bit mono, max 22050 Hz, DMA prenos, bez mixeru )

SB v2.0 vylepsena SB v1.0

SB pro - ( 8 bit stereo/mono, 44100Hz(mono), 22050Hz(stereo) )

SB 16 - 8/16 bit stereo/mono, 44100Hz, 2x DMA 8,16

SB 16ASP - jako SB16 + HW komprese ALaw/MuLaw/IMA ADPCM, zatim jsem napsal jen prvni alpha verzi

SB AWE32 - jako SB 16 ASP

ProAudio Spectrum 16 - karta podobna SB 16 + OPL-3

Gravis Ultrasound, Gravis MAX

ruzne MIDI karty vetsinou kompatibilni s MPU 401

- ovladace karet se musi pridavat do jadra - viz 'make config'

Programy pro vyuziti zvukovych karet

Prehravace slouzi k prehravani ruznych typu sound souboru od raw az po mod, s3m, ... , midi.

prehravace formatu mod, s3m,...

tracker prehravac amiga mod souboru ( pres /dev/dsp - viz pozdeji )

s3mod prehravac protracker s3m souboru a mod souboru ( pres /dev/dsp )

prehravace midi

mp, xmp mp je konzolova, xmp X Windows verze. Prehrava midi soubory pres /dev/sequencer. Muze pouzivat bud Gravis, FM (OPL-2/3) nebo external synthesizer. Pro FM syntezu potrebuje banky standartnich MIDI nastroju (std.sb, std.o3) a bubnu (drums.sb,drums.o3). Pro Gravise vyzaduje patche nastroju a bubnu (std.gus,drums.gus) dodavane s kartou. Ovladani je velice snadne. Pod X Windows je lepsi nastaveni parametru.

timidity prehravac, ktery pracuje na principu Gravise - z nasemplovanych nastroju vyrabi vysledny signal a ten bud uklada do soubodu ve formaty WAV nebo prehrava pres /dev/dsp.

ostatni

Svgafft - zobrazuje frekvencni spektrum signalu, potrebuje svgalib nebo existuje verze i do X ( zatim jsem ji nevidel ).

sod - prehravac, pracujici jako timidity, ale prehrava vlastni typ souboru

rawseq - docela dobra hracka - jako sod

maplay - prehravac mpeg sound formatu

ad - prehravac formatu adagio - prevadi i do mid formatu

sox - program na prevod

rsynth - program prevadejici psany text na rec

speak - jako rsynth, ale trochu horsi

ogi - rozpoznavani reci - jeste jsem to nestacil rozchodit (:-")

sox - program na prevadeni zvukovych formatu mezi sebou a provadeni ruznych effektu na nich

Mixery novejsi karty ( SB pro, SB16, Gravis, ... ) maji tzv mixer - dovoluje nastavovat hlasitosti vstupnich/vystupnich linek, urcovat zdroj nahravani.

konzolove mixery

cam, aumixer - ovladni pomoci kurzorovych klaves + zapinani nahravacich kanalu

X Windows mixery

xmix, xmixer - vyzkousejte si je

Jak se programove ovlada zvukova karta

Existuje nekolik standartnich zarizeni:

/dev/sndstat - provedte cat /dev/sndstat a uvidite info o aktualne nainstalovanych kartach

/dev/dsp - zarizeni ke PCM prehravani/nahravani

/dev/audio - jako /dev/dsp ale misto PCM samplu prichazeji Mu Law samply

/dev/mixer - zarizeni k ovladani mixeru

/dev/midi - slouzi jako nejjednodusi MIDI zarizeni dovoluje primo komunikovat s primojenym midi zarizenim

/dev/sequencer - MIDI zarizeji mnohem inteligentnejsi nez /dev/midi, dovoluje rozdelit prehravani vice zarizeni vlozenych do systemu

Pokud je v systemu vice zarizeni pak jsou na dalsich minor cislech, ktera se uvadeji za vlastnim jmenem ( napr. /dev/midi01 ).

Na zacatku se pomoci prikazu open otevre nami pozadovane zarizeni a pak se pomoci ioctl volani nastavuji parametry zarizeni a prikazy write/read provadi presun dat do/z karty. Vsechny info cerpany z linux/soundcard.h a zdrojaku jadra.

/dev/dsp

Nejjednodusim uzitim je toto: 'cat /dev/dsp > sample.raw' a dokud neprerusime tak se ukladaji samply do souboru sample.raw. Vzdy, kdyz se zarizeni otevira, tak se inicializuje na mono,8 bit, 8000 Hz. Pak soubor prehrajeme takto: 'cat sample.raw >/dev/dsp'.

A ted na urovni C

int dsp = open("/dev/dsp", O_RDWR );
ioctl( dsp, SNDCTL_DSP_RESET, NULL )
- resetuje kartu

ioctl( dsp, SNDCTL_DSP_SYNC, NULL )
- pocka do ukonceni prave probihajici operace

ioctl( dsp, SNDCTL_DSP_SPEED, int *speed )
nastavi rychlost na speed a do speed pak ulozi skutecne nastavenou hodnotu

ioctl( dsp, SNDCTL_DSP_STEREO, int *stereo )
- stereo = 0/1, vrati ve stereo skutecne nastavenou hodnotu

ioctl( dsp, SNDCTL_DSP_GETFMTS, int *afmts )
- vrati bitmapu podporovanych audio formatu:

AFMT_MU_LAW - Mu Law - logaritmicka komprese 16->8, uzivaji Sun spark

AFMT_A_LAW - A Law podobna Mu Law

AFMT_IMA_ADPCM - z 16 bit dela 4 bity

AFMT_U8 - unsigned 8 bit sample

AFMT_S16_LE - little endien signed 16 bit sample

AFMT_S16_BE - big endien signed 16 bit sample

AFMT_S8 - signed 8 bit sample

AFMT_U16_LE - little endien unsigned 16 bit sample

AFMT_U16_BE - big endien unsigned 16 bit sample

ioctl( dsp, SNDCTL_DSP_SETFMT, int *afmt )
- nastavi ( precte ) aktualni audio format a vrati skutecne nastaveny ( pokud afmt = AFMT_QUERY tak se vrati aktualni format )

dale pro /dev/dsp ioctl prikazu existuji synonyma jiz uvedenych prikazu - viz linux/soundcard.h

/dev/audio

- vse jako pro /dev/dsp, ale je inicializovano na audio format Mu Law. Pokud ho karta nepodporuje ( SNDCTL_DSP_GETFMTS ) tak je sw emulovano.

/dev/mixer

Existuje nekolik zarizeni, na ktere se odkazujeme pomoci jejich bitovych masek:

SOUND_MASK_VOLUME - hlasitost na vystupu

SOUND_MASK_BASS - basy na vystupu

SOUND_MASK_TREBLE - vysky na vystupu

SOUND_MASK_SYNTH - hlasitos synth

SOUND_MASK_PCM - hlasitost PCM

SOUND_MASK_SPEAKER - hl. pc speakru

SOUND_MASK_LINE - hl. line in

SOUND_MASK_MIC - hl. mic

SOUND_MASK_CD - hl. CD vstupu

SOUND_MASK_IMIX - recording monitor

SOUND_MASK_ALTPCM - druhe PCM zarizeni

SOUND_MASK_RECLEV - zaznamova hlasitost

ioctl( mixer, MIXER_READ(dev), int *volume )
- dev je SOUND_MASK_?????, do volume se pak ulozi hlasitost pozadovaneho zarizeni a to takto - do 1. byte se ulozi levy kanal ( 0-100 ) a do 2. byte se ulozi pravy kanal ( 0 - 100 ).

ioctl( mixer, SOUND_MIXER_READ_RECSRC, int *recsrc )
- do recsrc ulozi bitovou masku aktualniho nastaveni zaznamovych zarizeni.

ioctl( mixer, SOUND_MIXER_READ_DEVMASK, int *devices )
- do devices ulozi bitovou masku vsech mixerem podporovanych zarizeni.

ioctl( mixer, SOUND_MIXER_READ_RECMASK, int *maxrec )
- do maxrec da bit. masku vsech zarizeni, ze kterych je mozno nahravat.

ioctl( mixer, SOUND_MIXER_READ_STEREODEVS, int *strdev )
- do strdev da vsechna zarizeni schopna sterea.

ioctl( mixer, SOUND_MIXER_READ_CAPS, int *cap )
- do cap da schopnost mixeru - bitovou maskou, zatim jen SOUND_CAP_EXCL_INPUT - pokud je nastavena tak lze nahravat jen z jednoho zarizeni najednou.

ioctl( mixer, MIXER_WRITE(dev), int *volume )
- jako MIXER_READ, jen nastavuje hlasitosti.

/dev/midi, /dev/sequencer

- programovat tyto zarizeni bez hlubsi znalosti MIDI protokolu a nejakeho MIDI zarizeni je docela nezazivne a malo muzikantu pouziva Linux :-((. Vsechny ioctl prikazy jsou popsany v linux/soundcard.h a mnoho z nich uz primo nazvem rika, co delaji.

/dev/sequencer umoznuje inicializovat jak FM synth tak Gravis pomoci ruznych patchu.

Vsechny poznatky jsou cerpany ze zdrojaku jadra, vlastnich zkusenosti a nahodnych poznamek na ruznych mistech.

Zminovane programy lze stahnout z kazdeho ftp serveru, ktery mirroruje sunsite, napr ftp.muni.cz/pub/UNIX/linux/apps/sound.