Zvuková karta COVOX na LPT port. Dr. MM Ladislav Bačo, Dr. MM Petr Pecha 20. marca 2008 Abstrakt Na nasledujúcich stránkach nájdete popis konštrukcie a vysvetlenie činnosti zvukovej karty na LPT port PC, ako aj jej stručnú históriu. Obsah 1 Trocha histórie 2 2 Digitalizácia zvuku 2 3 Paralelný port 3 4 Konštrukcia zvukovej karty 4 5 Poďakovanie 5 6 Prílohy 6 6.1 Fotky hotovej karty........................ 6 6.2 Zdrojové kódy prehrávačov pre MS-DOS............ 7 6.2.1 Jednoduchý prehrávač od Ladislava Baču........ 7 6.2.2 Optimalizovaný prehrávač od Zlého Martina...... 8 1
1 Trocha histórie V 80. rokoch 20. stor. mali už počítače Commodor a Amiga pomerne dobré zvukové karty. Pre PC však stále neexistovalo dostatočne kvalitné zariadenie umožnujúce prehrávať digitálny zvuk okrem SoundBlasteru, ktorý stál okolo 10 000. V roku 1986 prišla na trh firma COVOX so zvukovou kartou pripojenou do paralelného portu iba za 70$. Šlo o vcelku jednoduchý DA (digitálno-analógový) prevodník s niekoľkými odpormi (prípadne ešte 1-2 kondenzátory), ktorý si každý amatérsky elektrotechnik mohol vyrobiť za oveľa nižšiu cenu. Táto zvková karta sa mohla pripojiť k HI-FI súprave, čím sa dosiahlo kvalitné zosilnenie zvuku. Neskôr sa objavili aj karty umožňujúce prehrávať stereo, vyžadovali však 2 LPT porty alebo komplikovanejší obvod, ktorý veľmi rýchlo prepínal zvukový výstup medzi dvoma kanálmi. 2 Digitalizácia zvuku Pretože zvuk sa šíri ako analógový signál (spojité vlny), tak pre jeho spracovanie v počítači ho musíme najprv previesť do digitálnej podoby. Tento proces sa nazýva samplovanie. princíp spočíva pomocou pravidelného odčítania hodnoty signálu pomocou A/D prevodníku a zaznamenaní tejto hodnoty v digitálnej podobe (v binárnej sústave). Ako často sa odčítava táto hodnota, určuje vzorkovacia frekvencia (pri Audio CD 44,1 khz), čím väčšia, tým kvalitnejší záznam, nízka vzorkovacia frekvencia môže záznam znehodnotiť (obrázok). 2
Dôležité je aj rozlíšenie, s akým sa odčítava hodnota signálu, pri malom rozlíšení vzniká počiteľný šum v dôsledku zaokrúhľovania hodnôt signálu. Pri Audio CD sa používa 16 bitové rozlíšenie (naša zvuková karta je prispôsobená 8 bitovému). Nakoniec sa tieto nekomprimované údaje uložia do zvukového súboru, najčastejšie do formátu wav. Tieto súbory obsahujú v hlavičke okrem iného záznam o vzorkovacej frekvencii, počte bitov prehrávaných za sekundu, veľkosť súboru... 3 Paralelný port Paralelný alebo LPT port je 25 pinový, na počítači je konektor s dierkami. Najčastejšie sa používa na pripojenie tlačiarne, na čo bol aj navrhnutý. Piny C0 až C3 sú kontrolné, S0 až S4 prenášajú status tlačiarne (napr. že tlačí, v zásobníku už nemá papier), piny D0 až D7 prenášajú 8 bitové údaje, pričom D0 je nultý bit, D7 siedmy bit, a piny 18 až 25 sú uzemnenie. Keď je na niektorom z dátových pinov logická 1, tak napätie medzi ním a zemou je zhruba 5V, čo postačuje pre činnosť zvukovej karty bez prídavného napájania. 3
4 Konštrukcia zvukovej karty Táto zvuková karta prehráva 8 bitový zvukový záznam pomocou všetkých 8 dátových pinov na LPT porte. Pretože logická 1 na pine D0 (1/255 maximálnej hodnoty) má inú váhu ako na pine D2 (4/255 maximálnej hodnoty), je potrebné zabezpečiť, aby jednotlivé piny prispievali k výslednej hodnote napätia na výstupe v rovnakom pomore, v akom sú ich hodnoty, resp. váhy. Teda nultý bit by mal prispieť 1/255.5V, prvý 2/255.5V, druhý 4/255.5V,... siedmy 128/255.5V. To sa dá dosiahnuť pripojením jedného rezistora s vhodným odporom medzi každý pin a výstup. Lenže v tomto prípade by hodnoty odporov boli dosť nepraktcké a ťažko by sa zháňali. Zapojenie by vyzeralo približne takto: Existuje však aj zapojenie, pri ktorom sa použijú bežne dostupné rezistory (10 a 20 kω). Rezistory v ňom vytvárajú odporový rebrík. 4
Pre skvalitnenie zvuku však ešte môžme pridať kondenzátory, ktoré vyhladia výslednú zvukovú vlnu a tiež orežú vysoké frekencie. 5 Poďakovanie Zlému Martinovi Dekarovi za výraznú pomoc pri stavbe a vysvetlenie princípu zvukovej karty COVOX a tiež za prehrávač. Martinovi Marblovi Beránkovi za pomoc pri rozbiehaní COVOXu pod Linuxom a pri pokuse prepojiť starý notebook s novým cez sériový kábel. 5
6 Prílohy 6.1 Fotky hotovej karty 6
6.2 Zdrojové kódy prehrávačov pre MS-DOS 6.2.1 Jednoduchý prehrávač od Ladislava Baču program WAV_player; uses dos, crt; var b: byte; path,s: string; f: file of byte; position, size: longint; c: char; function exist(s0: string): boolean; var dirinfo: SearchRec; findfirst(s0, anyfile, Dirinfo); if DosError=0 then exist:=true else exist:=false; getdir(0,path); writeln( WAV player pre MS-DOS a zvukovu kartu na LPT ); writeln; if paramcount>0 then s:=paramstr(1); if length(path)>3 then path:=concat(path, \,s) else path:=concat(path,s); if exist(path)=true then assign(f,path); reset(f); size:=filesize(f); writeln( playing:,s); position:=0; write( pozicia:,position, B z:,size, B ); while not eof(f) do inc(position); 7
if position mod 1024 =0 then if keypressed then c:=readkey; if c=#0 then c:=readkey; if c=#27 then halt; gotoxy(1,wherey); write( pozicia:,position, B z:,size, B ); read(f,b); port[$378]:=b; gotoxy(1,wherey); write( pozicia:,position, B z:,size, B ); close(f); end else write( Subor,s, nenajdeny! ); writeln; end else writeln( usage: play <filename> ); end. 6.2.2 Optimalizovaný prehrávač od Zlého Martina uses dos, crt; const defrychlost = 4; maxpole = 64000; defkoef = 100; prirkoef = 25; maxzaznam = 10; {pocet 64K supliku} type trec = array [0..maxPole] of byte; {struktura 65K} tprec = ^trec; {odkaz na 1 strukturu 64k} tzvuk = array[0..maxzaznam] of tprec; { pole odkazu na 64k struktury = cela WAV} var b,rychlost: byte; path,s: string; f: file of byte; a: trec; delka,koef: word; 8
ss : char; {stisknuty Symbol} velikost : longint; {velikost nactenych dat} zvuk : tzvuk; indexzaznamu : 0..maxZaznam; {pocet supliku} procedure prehraj(rychlost:byte);forward; procedure zkontrolujklavesy; if (keypressed) then ss:=readkey; case ss of #0 : ss:=readkey; case ss of #80 :;inc(rychlost); if rychlost = 255 then rychlost:= defrychlost; gotoxy(1,7); writeln( Rychlost:,rychlost); #72 :;dec(rychlost); if rychlost = 255 then rychlost:= defrychlost;gotoxy(1,7); writeln( Rychlost:,rychlost); #75 :;inc(koef,prirkoef); gotoxy(1,8);writeln( Koeficient:,koef); #77 :;dec(koef,prirkoef); gotoxy(1,8);writeln( Koeficient:,koef); #32: ; gotoxy(1,10);clreol; write( [ ] );gotoxy(2,wherey);prehraj(rychlost); {case} {ifu keypressed} procedure prehraj(rychlost:byte); var I: word; K: longint; {index bytu, ktery prehravam} for K:=0 to velikost do zkontrolujklavesy; 9
port[$378]:=zvuk[(k div maxpole)]^[k mod maxpole]; {posli data ze spravneho supliku na port} if (K~mod (velikost div 20)) = 0 then ;gotoxy(wherex,10);write(#2223); for I:= 1 to rychlost*koef do; procedure nactisouborzkonzole; getdir(0,path); if paramcount>0 then s:=paramstr(1) else writeln( Hod mi do parametru.wav soubor );halt; if length(path)>3 then s:=concat(path, \,s) else s:=concat(path,s); writeln( Oteviram soubor:,s); assign(f,s); reset(f); delka:=0; rychlost:=defrychlost; koef:=defkoef; velikost:=filesize(f); writeln( velikost souboru je:,velikost:10, B ); writeln( do pameti se vejde:,maxavail:10, B ); if maxavail < maxpole then writeln( sorry nemam ani 64K volnych ); halt; new(zvuk[indexzaznamu]); {mame volno > 64K alokujeme prvni suplik} write( [ );gotoxy(wherex+60,wherey);write( ] ); gotoxy(2,wherey); while (not(eof(f))) do read(f,b); {nacti byte} zvuk[indexzaznamu]^[delka]:=b; {uloz byte do struktury do spravneho supliku} 10
inc(delka); if delka > maxpole then {suplik je plny} if (indexzaznamu < maxzaznam) and (maxavail>maxpole) then {ale cela struktura jeste ne} inc(indexzaznamu); {budeme ukladat do dalsiho supliku} delka:=0; {od prvniho indexu} new(zvuk[indexzaznamu]); end else writeln( vleze se mi do pameti pouze:,maxpole*indexzaznamu+delka); break; {grafika} if (delka mod (velikost div 60)) = 0 then write(#254); writeln( ] ); {velikost:= longint( (indexzaznamu+1)*maxpole)+delka; } clrscr; nactisouborzkonzole; writeln( Nacteno do pameti:, velikost, bytu ); ss:=#250; {init mimo rozsah} write( spusten rezim prehravani - mezernik hraje, ); writeln( sipka nahoru/dolu meni rychlost ); writeln( Rychlost :,rychlost); writeln( Koeficient:,koef); writeln( Delta koeficientu :,prirkoef); while ss<>#27 do {do stisku ESC} ss:=#250; zkontrolujklavesy; {while} close(f); port[$378]:=0; {bud ticho} end. 11