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:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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