II.rész

Sziasztok, ismét itt vagyok, és ismét a hangkártyákkal foglalkozunk. Az elôzô részben megtárgyaltuk a SB kártyák portjait, melyek között voltak FM portok és voltak DSP portok (mixer is...), amelyekkel ma fogunk foglakozni. Ezek a Digital Signal Processor portjai. Tehát...

A múltkori portlistában szerepelt, hogy ezek a portok csak adat és parancsportok, ez azt jelenti, hogy a DSP-t ezen keresztül még programozni kell, de nem olyan nehéz ez sem. Nos, ha egy parancsot szeretnénk kiküldeni a DSP felé (legyen az akár egy hangkiadó parancs), akkor a következôket kell tennünk:

- a 22Ch portot megvizsgáljuk és várunk, míg a 7. bitje (legfelsô) 0-ra nem vált, ez jelenti, hogy mehetnek az adatok

- szintén a 22Ch portra írjuk ki a parancsbyteot

- ha további adatok is mennek a parancs után (pl.:hangminta egy byteja), akkor azokat a várakozás (első pont) írhatjuk ki folyamatosan. A kártya tudja, hány adatot várjon.

- ha adatot kapunk a kártyáról, akkor szintén várakozni kell, de most a 22Eh port 7. bitjének 1-re állásához (nem tévedtem, tényleg fordítva van, mint a 22Ch-nál)

- a várakozás után pedig a bejövő adatot a 22Ah portról olvashatjuk be. Ha több van akkor újabb várakozás és olvasás.

Röviden ennyi lenne a DSP programozása, most már csak azzal kell megismerkednünk, hogy milyen parancsokat ismer a kártya. Nem növekvő számsorrendben lesznek a parancsok, hanem fejlôdési sorrendben, azaz a SB1.0, a 2.0 , a PRO parancsok lesznek egy csokorba foglalva. Erre azért van szükség, mert van egy kis keveredés itt is, mint mindig a kompatibilitás körül, azaz van "...csak ez tudja, de ezek közül, esetleg ekkor, ez is..." jellegű mondat és a csoportos bontásban talán egyszerűbb megérteni a képességek szisztémáit. El is kezdem, mert nem fogok beleférni egy számba...

SB 1.0-tól

10h - Közvetlen 8-bites DA (Digital->Audio=lejátszás)

Paraméterei: egy 8 bites minta

- Hangminta lejátszás legegyszerűbb módja, de csak 23Khz-ig működik

14h - DMA-s 8-bites DA

Paraméterei: átvitel hosszának alsó byteja, felsô byteja

- 8-bites, egyciklusú DMA kezdeményezése, ahol az átvinni kívánt byte a minták számánál egyel kisebb. A lejátszás végeztével egy IRQ fut be a beállított megszakításon. Ez a jelzô része a dolognak és majd a mintaprogramok egyértelműsítik a parancsot.

20h - Közvetlen 8-bites AD (Audio->Digital=felvétel)

Paraméterei: -

Olvasandó: egy 8 bites minta

- Hangminta felvétel legegyszerűbb módja, de csak 23Khz-ig működik

24h - DMA-s 8-bites AD

Paraméterei: átvitel hosszának alsó byteja, felső byteja

- 8-bites, egyciklusú DMA kezdeményezése, ahol az átvinni kívánt byte a minták számánál egyel kisebb. A lejátszás végeztével egy IRQ fut be a beállított megszakításon. Ez a jelzô része a dolognak és majd a mintaprogramok egyértelműsítik a parancsot.

- SB 16 előtt az első minta úgy érkezik, mintha sima felvétel lenne (olvasás)

40h - Időkonstans beállítása

Paraméterei: a konstans

- Az interrupt generálódásának periódusideje

Konstans:=256-(1000000/mintavételfrekvencia*csatornaszám)

(Mono kártyáknál csak egy csatorna van!)

80h - Csend küldése a DSP-n

Paraméterei: csend hosszának alsó, majd felső bájtja

- Hosszal megadott számú csendmintát küld ki, majd a végén IRQ-t generál.

D0h - 8 bites DMA felfüggesztése

Paraméterei: -

- Megállítja a folyamatban levô 8-bites DMA átvitelt. SB16-on is csak a 8-biteseket!

D4h - Felfüggesztett 8 bites DMA folytatása

Paraméterei: -

- Folytatja a D0h-val megszakított DMA-t.

D1h - Erősítő bekapcsolása

Paraméterei: -

- Bekapcsolja a kártya erősítő kimenetét, Pl. a DSP reset is letiltja, úgyhogy vissza kell kapcsolni. Nagyon sok kompatibilitási probléma kapcsolódik ide. A DMA-t néha felfüggeszti, felvétel nem sikerül, vagy zajos. A néha azt jelenti, hogy szisztematikusan történnek ugyan a hibák, de az egyes kártyák saját, specifikus hibáit ömlesztve írtam le. Bocs...

D3h - Erősítő kikapcsolás

Paraméterei: -

- Kikapcsolja a kimenetet. A fent említett problémák itt is jelentkez(het)nek.

D8h - Erősítő lekérdezése

Paraméterei: -

Olvasandó: egy érték byte

- Ha az olvasott érték=0, akkor a kimenet ki van kapcsolva, ha viszont 255-öt olvastunk, akkor be van kapcsolva.

E1h - DSP verziószám

Paraméterei: -

Olvasandó: fô, majd alverziószám

- Olvasott értékeket felhasználva eldönthetô a kártya verziószáma:

SB 1.0
1.05 (másolatok 2.0) 
SB 1.5
1.05 (másolatok 2.0) 
SB 2.0
2.01
SB Pro
3.00
SB Pro 2
3.01 v. 3.02
SB 16
4.04 v. 4.05
SB 16 SCSI-2
4.11
SB AWE-32
4.12
SB AWE-64
4.14
Ha két, egymás utáni olvasás más eredményt ad vissza, akkor két kártyát pakoltunk ugyanarra a portra és így sajnos egyik sem fog működni, úgyhogy változtassunk.

F0h - Sinus generátor

Paraméterei: -

- Tesztelési célokhoz készített funkció, mely egy kb. 1920 Hz-es hangot ad ki 15625-ös lejátszási frekvencián. SB 16 előtt a kimenetet is bekapcsolja. Érdekes egy funkció, nem nagyon használt.

F2h - 8 bites IRQ kérése

Paraméterei: -

- Hardvertôl függetlenül mi is kérhetünk IRQ-t.

Itt mondanám el, hogy mit kell legalább csinálnia az IRQ-(nk)nak, hogyan kell nyugtáznia. A nyugtázás a 22Eh port olvasásából és a 20h-s portra történô 20h érték kiküldésébôl áll. Általában az megszakítás vezérlô a 20h porton van, de nem biztos. De mi azért ezt feltételezzük!

SB 2.0-tól

1Ch - Auto-Init DMA-s 8 bites DA

Paraméterei: -

- Kétciklusú DMA-t kezdeményez. Tudjátok, ez az a DMA, amelyik önmagát programozza fel, mert úgy viselkedik, mintha csak a DMA terület fele volna jelen. Ez a funkció csak referencia szinten kerül tárgyalásra, mert az újság kereteit meghaladná a téma.

90h - Auto-Init (nagysebességü) DMA 8 bites DA

Paraméterei: -

- Nagyobb sebességő DMA átvitel kezdeményezése

2Ch - Auto-Init DMA-s 8 bites AD

Paraméterei: -

- Kétciklusú DMA-t kezdeményez. Ugyanaz, mint az elôzô. csak az lejátszás, ez pedig felvétel.

98h - Auto-Init (nagysebességü) DMA 8 bites AD

Paraméterei: -

- Nagyobb sebességű DMA átvitel kezdeményezése

48h - DMA blokk-méret beállítása

Paraméterei: blokk méretének alsó, majd felsô bájtja

- Az Auto-Init DMA által igényelt blokk méretét adhatjuk meg (<64k)

DAh - Auto-Init DMA 8 bites felfüggesztése

Paraméterei: -

- Normál DMA-hoz hasonlóan ez is felfüggeszthetô. Újraindítás a D4h paranccsal történhet.

E0h - DSP azonosítás

Paraméterei: egy tetszôleges adat

Olvasandó: az adat negáltja

- Ha a fenti feltételek teljesülnek, akkor valóban egy DSP-vel beszélgetünk.

Látjátok, mindössze ennyi az, amit az SB kezeléséhez tudni kell, sôt ebbôl is a SB2.0-ás funkciók csak az érdekesség képen kerültek ide bele. Jó, persze vannak még MIDI-parancsok, vannak SB 2.0, Pro, Pro 2, SB16 specifikus parancsok, de ezek igazából csak kényelmet és minôségbeli javítást szolgálnak, de joggal állíthatom , hogy a középhaladó programozók is megelégszenek ennyivel. Csupán egyetlen dolgot kérdezhetnétek meg. Azt, hogy mi van a PRO MIXER-ével ? Jó kérdés, ugyanis nem csak buta gyári programokon keresztül lehet ôket kezelni, hanem portokon keresztül is, és érdekes effekteket lehet vele kicsikarni a gépbôl. Pont ez lesz a következô cikk témája.

De most kanyarodjunk vissza a példaprogramjainkhoz:

Az elsô mintaprogram a DSP közvetlen elérését demonstrálja és ezzel a technikával mutatja be a lejátszás legegyszerűbb, de egyben legkevésbé pontos módját. El mondom, mirôl is van szó ! Szóval ez a lejátszási mód sajnos, amennyire "egyszerű", annyira pontatlan, mivel az idôzítés a két minta kiküldése között van, így egy esteleges befutó IRQ egy pillanatra felfüggeszti a lejátszást és - ami a legfontosabb - a késleltetést is. Hiába van beletéve egy CLI és egy STI utasításpár, egyszerűen - hivatkozva Murphyre - valami mégis belecsúszik - szó szerint - a számításunkba. Mindezek mellett a gépek egyedi parancsvégrehajtó sebessége sem egy egyszerű dolog, hiszen igazából detektálnunk kellene a processzor típusát és ehhez is igazodnunk kellene. És, hogy semmit se felejtsek ki, közben a 486-osok belsô CACHE-jét is figyelni kellene, hogy az ugrócímekre van e bennük találat. Ha van, többet kellene várni. De ez már egy kicsit más területe a programozásnak. Ha befejeztem az AUDIO rovatot, akkor esetleg kezdhetnék egy Low-Level-HardWare rovatot is, amiben pont ilyen dolgokról esne szó, mint például a gépfüggetlen idôzítés ms-os nagyságrendekben.

A második mintaprogramocska az elsô fordítottja, itt a felvételen van a hangsúly. Itt is igazak a fent említett problémák és ezt észre is lehet venni, ha a 2. programmal felvett mintát játszátok le a 1.-vel, annak ellenére, hogy mindkettô 15kHz-en működik. És az elôbb nem említettem azt, hogy a direkt DSP eléréssel az a nagy gond a pontatlanság mellett, hogy a parancsok végrehajtásából és a kártya belsô adatátvitelébôl következôleg csak kb. 23kHz-ig van garantálva a lejátszás és a felvétel egyaránt. Régen ez nagyon jónak számított, de manapság, mikor már a 44.1kHz stereo 16 bit a standard configuráció, ez nagyon kevés. Viszont a hanganalízishez erre van szükség, azaz, ha bájtról bájtra nyomon szeretnéd követni a lejátszást nincs választási lehetôség. Csak ez van, hiszen a DMA lényege, hogy beállítasz mindent, kikerül a kezed közül az irányítás és csak e lejátszás végérôl kapsz egy jelentést...

És éppen erről szól a 3. mintaprogram. Nincs mit tennünk, csupán csak elindítjuk a DMA rendszert és a végén jelentést kapunk. Közben, mint az a példaprogramban megfigyelhetô, bármit csinálhatunk, például írhatunk a képernyôre, teljes sebességgel. Ez fontos, ugyanis, így tulajdonképpen a háttérben játszuk le a mintát és a minta végén kell csak a műveletünket megszakítani. Közben minden teljes sebességgel folyhat, illetve pontosabban 99.9%-os sebességgel, ugyanis a DMA végén jönnek az IRQ-k. Hozzátartozik ehhez az , hogy például a minden lemezművelet - pontosabban a cache találatok nélküliek - DMA-t kezdeményeznek és a gép csak a lemez fizikai műveleteire vár a lemez elektronikájából az adatokat a processzort kikerülő DMA hozza be a memóriába. Ez a lényege. Nincs időpazarlás. Nagyon jó!

A 4. program egy kicsit kacifántos, ugyanis nem nagyon működik. Ne nevessetek ki, de őszintén megvallva nem tudom mi a hibája. Kisebb átviteli intervallumot megadva működik, de nagyobbat megadva csak DOS promptból fut le hibátlanul. Tartom valószínűleg, hogy az IDE (fejlesztői környezet) belső debuggerei és a programhoz linkelt Run-Time-Error-Manager (RTEM) okozza a galibát, ugyanis TASM-be megy a dolog. Ha valaki tud nekem valami jobb magyarázattal szolgálni, kérem tegye meg! Előre is köszi és bocs...

Nagyjából ennyit akartam elmondani a SB1.0-ról, ugyanis ez az! A következô körben a PRO mixerével fogunk foglalkozni, ha akkor is elolvassátok, amit írtam. Ugyan csak referencia lesz, de azzal már igazából ki lehet hozni a térhatást és a BASS/TREBLE effektusokat.

Röviden ennyi és ha valakinek bármi kérdése van, akár hangkártyával ,akár más programozási területtel kapcsolatban, írjatok nekem és válaszolok, amennyiben tudok. Sziasztok, találkoz(z)unk ismét....

 

Mr.TSCHuby
eMail:PC-XUser@IDG.HU, Subject: "Audio rovat"
TSCHSOFT@YAHOO.COM