7490
Szczegóły |
Tytuł |
7490 |
Rozszerzenie: |
PDF |
Jesteś autorem/wydawcą tego dokumentu/książki i zauważyłeś że ktoś wgrał ją bez Twojej zgody? Nie życzysz sobie, aby podgląd był dostępny w naszym serwisie? Napisz na adres
[email protected] a my odpowiemy na skargę i usuniemy zabroniony dokument w ciągu 24 godzin.
7490 PDF - Pobierz:
Pobierz PDF
Zobacz podgląd pliku o nazwie 7490 PDF poniżej lub pobierz go na swoje urządzenie za darmo bez rejestracji. Możesz również pozostać na naszej stronie i czytać dokument online bez limitów.
7490 - podejrzyj 20 pierwszych stron:
Norbert Kilen - Programowanie Kart Dzwiekowych w Turbo Pascalu
Wydanie pierwsze
ISBN 83-85455-69-8
SPIS TRE�CI
Spis tre�ci
SPIS ILUSTRACJI 6
WST�P 7
1. SOUND BLASTER - PODSTAWY 9
2. OBS�UGA PLIK�W VOC 11
2. l STRUKTURA PLIKU VOC 11 2.2 STEROWNIK CT-VOICE 16
SPOS�B KORZYSTANIA ZE STEROWNIKA 16 OM�WIENIE FUNKCJI STEROWNIKA 20 ZASADY KORZYSTANIA Z FUNKCJI 27 BIBLIOTEKA VOC.TPU 28 PRZYK�ADY 38 2 3 OBS�UGA WI�KSZYCH PLIK�W 42
SPIS TRE�CI
3. OBS�UGA PLIK�W CMF 53
3.1 STRUKTURA PLIK�W CMF 53 Blok nag��wka 54 Blok instrument�w 55 Blok muzyczny 55
3.2 FORMATY SBI i IBK 55
3.3 STEROWNIK SBFM 57
SPOS�B KORZYSTANIA ZE STEROWNIKA 58 OPIS FUNKCJI STEROWNIKA 59 ZASADY KORZYSTANIA Z FUNKCJI 63 BIBLIOTEKA CMF.TPU 64
3.4 PRZYK�ADY 73
4. PROGRAMOWANIE DSP 79
4.1 ZASADY OBS�UGI DSP 79 Zerowanie DSP 80 Zapis do DSP 80 Odczyt z DSP 81 Obs�uga przerwania DSP 81
4.2 TRYB BEZPO�REDNI 82
4.3 Tryb DMA 93
4.4 OBS�UGA Z��CZA MIDI 97 Tryb bezpo�redni 98 Tryb przerwa� 99
4.5 KOMENDY DSP 99 Rozkaz 1xh 99 Rozkaz 2xh 101 Rozkaz 3xh 101 Rozkaz 40h 102 Rozkaz 7xh 102 Rozkaz Dxh 102 Rozkaz E l h 103
4.6 BADANIE KONFIGURACJI SB 104
5. PROGRAMOWANIE SYNTEZERA FM 109
5. l FUNKCJONOWANIE SYNTEZERA FM 109
SPIS TRE�CI
5.2 ZASADY OBS�UGI SYNTEZERA FM 112 Zapis danej do rejestru 113 Odczyt rejestru statusowego 113
5.3 PRZYK�ADY 122
6. SYGNA�Y l ICH PRZETWARZANIE 131
6. l Co to s� sygna�y i jak je dzielimy 131
6.2 Przetwarzanie analogowo-cyfrowe 133 Pr�bkowanie 134 Kwantyzacja 135
6.3 Filtracja cyfrowa 136
6.4 Analiza widmowa sygna�u 139
6.5 Rozpoznawanie mowy ludzkiej 140
7. FORMAT WAV 147 LITERATURA 151
6
SPIS ILUSTRACJI
1.
2.
3.
4.
5.
6.
7.
8.
9.
Karta Sound Blaster w wersji 2.0 10
Struktura pliku VOC z p�tl� Repeat Loop 15
Mechanizm odwo�ywania si� do funkcji CT-VOICE 17
Obwiednia ADSR (Attack/Decay/Sustain/Relase) 110
Synteza operatorowa 112
Dwa typy obwiedni 116
Synteza FM i addytywna 120
Kszta�t fali generowanej przez oscylator operatora 121
Widmo pr��kowe 132
10. Przetwarzanie analogowo-cyfrowe 134
11. Efekt niejednoznaczno�ci 134
12. Aliasing 135
13. Przyk�adowa charakterystyka kwantyzatora 136
14. Charakterystyki filtr�w dolno- i �rodkowoprzepustowego 137
15. Wp�yw dobroci na kszta�t charakterystyki filtru 137
16. Ograniczenie zakresu zmian amplitudy 141
17. Przyk�adowy wykres widmowy 144
18. Widmo pr��kowe 145
19. Aproksymacja przebiegu wykresu widmowego 145
WST�P
WST�P
Od kilku ju� lat multimedia to dziedzina zdobywaj�ca coraz wi�ksz� popularno��. Kluczow� rol� w technice multimedialnej odgrywa d�wi�k. Jego �r�d�em s� specjalne karty - np. opisywany w ksi��ce Sound Blaster. Karty takie s� te� obs�ugiwane przez programy rozrywkowe. Niestety ma�o jest publikacji po�wi�conych zasadom ich programowania i omawiaj�cych to zagadnienie w spos�b wyczerpuj�cy. Mam nadziej�, �e moja ksi��ka wype�ni cho� w cz�ci t� luk� i oka�e si� pomocna dla wszystkich zainteresowanych tworzeniem oprogramowania wsp�pracuj�cego z kartami SB. Wszystkie przyk�ady prezentowane w pracy zosta�y przygotowane przy u�yciu kompilatora Turbo Pascal w wersji 6.0 firmy Borland Inc. Ich teksty �r�d�owe oraz kompilaty znajdzie Czytelnik na dyskietce do��czonej do ksi��ki. Zak�adam, �e Czytelnik ma umiej�tno�� programowania w dowolnym j�zyku oraz elementarn� wiedz� na temat funkcjonowania systemu DOS i architektury komputer�w PC.
Mimo �e przedstawione przyk�ady napisane zosta�y w Pascalu, nic nie stoi na przeszkodzie, aby opisywane w pracy algorytmy wykorzysta� pisz�c programy w innych j�zykach - np. C, Assembler. Ostatni rozdzia� po�wi�cony jest zagadnieniom zwi�zanym z przetwarzaniem d�wi�ku: filtrom cyfrowym, analizie widmowej, rozpo-
WST�P
znawaniu mowy. Traktowa� go nale�y wy��cznie jako wprowadzenie do opisywanych temat�w.
Na koniec chcia�bym podzi�kowa� Matce oraz Kasi Byczkowskiej bez pomocy kt�rej ksi��ka ta by� mo�e w og�le by nie powsta�a
Autor
9
SOUND BLASTER - PODSTAWY
l. SOUND BLASTER - PODSTAWY
Karta Sound Blaster po raz pierwszy zaprezentowana zosta�a w 1989 roku. Kilka miesi�cy p�niej by�a ju� najlepiej sprzedaj�cym si� rozszerzeniem muzycznym przeznaczonym dla komputer�w PC. Przyczyny niew�tpliwego sukcesu to z pewno�ci� do�� du�e mo�liwo�ci i niska cena przy zachowaniu zgodno�ci programowej z wcze�niejszym dominantem - kart� AdLib firmy AdLib Inc. Obecnie, nawet w chwili gdy faktycznym standardem s� ju� karty 16-bitowe, poczciwy SB wci�� trzyma si� dobrze. Dzieje si� tak mi�dzy innymi dlatego, �e najprostsz� kart� zgodn� ze standardem SB 2.0 naby� ju� mo�na za cen� ni�sz� ni� 100 z�otych.
Oto gar�� podstawowych informacji na temat parametr�w karty Sound Blaster:
� 11-g�osowy syntezer FM. Mo�e pracowa� w dw�ch trybach:
w trybie melodycznym (9 g�os�w) i w trybie rytmicznym (mo�liwo�� syntezy sze�ciu r�nych brzmie� i korzystania z pi�ciu brzmie� perkusyjnych: b�ben basowy, talerz, werbel, b�benek i high hat). Syntezer FM zapewnia zgodno�� z kart� AdLib -oparty jest na tym samym uk�adzie (FM1312).
� Mo�liwo�� zapisu i odtwarzania pr�bkowanych d�wi�k�w. Konwersja analogowo-cyfrowa i cyfrowo-analogowa realizowana jest przez serce karty SB - uk�ad DSP [Digital Sound Processor).
ROZDZIA� 1
Pr�bkowanie i odtwarzanie kolejnych pr�bek d�wi�ku mo�e odbywa� si� z r�n� (w zale�no�ci od wersji karty) cz�stotliwo�ci�. l tak dla kart w wersjach l.x maksymalna cz�stotliwo�� pr�bkowania wynosi 12 kHz, maksymalna cz�stotliwo�� odtwarzania - 23 kHz, w wersji 2.0 (wymiana DSP z 1.05 na 2.00) maksymalna cz�stotliwo�� pr�bkowania to 15 kHz, a odtwarzania - 44,1 kHz. Zapis d�wi�ku we wszystkich wersjach karty jest dokonywany z 8-bitow� rozdzielczo�ci�. Uk�ad DSP zapewnia mo�liwo�� kompresji samplowanego sygna�u w czasie rzeczywistym wed�ug trzech algorytm�w (ADPCM 4:1, 3:1, 2:1). Dekompresja mo�e by� realizowana w czasie rzeczywistym.
� Mo�liwo�� wsp�pracy z urz�dzeniami MIDI. Urz�dze� wyposa�onych w z��cza typu MIDI niestety nie mo�emy po��czy� bezpo�rednio do karty Sound Blaster - konieczne jest u�ycie tzw. Sound Blaster MIDI Kit. Jest tak, poniewa� na karcie nie znajduj� si� standardowe gniazda MIDI (DIN).
� Mo�liwo�� wsp�pracy z joystick'iem analogowym. W wersji 1.0 karty znajduje si� te� modu� CMS upgrade. By� on instalowany w celu zapewnienia zgodno�ci z poprzednim wyrobem firmy - kart� Gam� Blaster, zawieraj�c� uk�ad 12-g�osowej syntezy AM.
Rysunek l przedstawia rozmieszczenie najwa�niejszych element�w karty Sound Blaster 2.0.
h UNE-IN LLJP WE MIKROFON
|Potefiqome� fegutwy gtosnosd
WYStUCHAWK.
Z�qcze JOY/MO
Rys.! Karta Sound Blaster w wersjl 2.0
11
OBS�UGA PLIK�W VOC
2. OBS�UGA PLIK�W TO�
Format VOC (Creative Voice File) to przyj�ty przez firm� Creative Labs Inc. format zapisu plik�w zawieraj�cych dane d�wi�kowe. Pliki tego typu obs�uguj� programy do��czane do kart serii Sound Blaster. Przyk�adem mog� by� programy VOXK1T i VEDIT. Zalet� jest du�a funkcjonalno�� i uniwersalno�� plik�w VOC. Ich obs�uga jest bardzo prosta - informacje w nich zawarte ca�kowicie opisuj� spos�b odtwarzania (w strukturze VOC znalaz�o si� miejsce na dane dotycz�ce cz�stotliwo�ci pr�bkowania d�wi�ku, a tak�e sposobu kompresji danych). Tematem tego rozdzia�u jest stosowanie sterownik�w dostarczanych przez Creative Labs Inc. przy programowaniu obs�ugi plik�w zapisanych w tym formacie.
2.1 STRUKTURA PLIKU VOC
Zasadniczo w strukturze pliku VOC wyr�ni� mo�na dwa bloki: blok nag��wka i blok danych. Blok nag��wka lo blok przechowuj�cy identyfikator pliku, numer wersji oraz (bardzo wa�ne przy programowaniu) adres pocz�tku bloku danych. Blok danych to naturalnie cz�� pliku przeznaczona do przechowywania danych d�wi�kowych. Mo�e by� on podzielony na kilka, funkcjonalnie r�nych, cz�ci.
ROZDZIA� 2
Blok nag��wka
Po�o�enie wzgl�dem pocz�tku pliku
Opis
0-19
20-21
21-23
24-25
Opis pliku. W tym miejscu przechowywany Jest napis:
,.Crealive Voice File" oraz bajt o warto�ci szesnastkowej 1A.
Przesuni�cie pocz�tku bloku danych wzgl�dem pocz�tku pliku. Warto�� lego st�wa wykorzystujemy programuj�c obs�ug� pliku VOC (d�ugo�� nag��wka dla r�nych wersji formatu mo�e by� przecie� inna).
Numer wersji formatu pliku. M�odszy bajt przechowuje mniej znacz�c� cz�� numeru, starszy - bardziej znacz�c�.
Kod identyfikacyjny pliku VOC u�atwiaj�cy rozpoznanie pliku zapisanego w tym formacie. Jest r�wny sumie s�owa przechowuj�cego numer wersji formatu i s�owa o warto�ci szesnastkowej 1234.
Blok danych
Ta cz�� pliku podzielona jest na wiele podblok�w spe�niaj�cych r�ne funkcje. Regu�� jest tu, �e pierwszy bajt podbloku specyfikuje jego typ. W zasadzie programista nie musi wnika� w struktur� poszczeg�lnych podblok�w, gdy� za odpowiedni� interpretacj� zawartych w nich danych odpowiedzialne s� funkcje sterownik�w CT-VOICE i CVDSK, opisywane w dalszej cz�ci rozdzia�u. Znajomo�� funkcji podblok�w jest jednak konieczna do pe�nego wykorzystania mo�liwo�ci dostarczanych programi�cie.
A oto jak przedstawiaj� si� dost�pne typy podblok�w:
� Typ O - Terminator (podblok ko�cz�cy)
Pojedynczy bajt o warto�ci O (BLKTYPE=0). Ten podblok ko�czy ca�y blok danych. Procedura odtwarzaj�ca d�wi�k ko�czy dzia�anie po napotkaniu tego podbloku.
� Typ l - Voice Data (dane d�wi�kowe)
Podblok przechowuj�cy spr�bkowany d�wi�k wraz z opisem. Jego struktura przedstawia si� nast�puj�co:
13
OBS�UGA PLIK�W VOC
Przesuni�cie Opis
O Bajt o warto�ci l u�ywany przy identyfikacji podbloku (BLKTYPE=1).
l Trzy bajty opisuj�ce ilo�� bajt�w zajmowanych przez blok (BLKLEN). Liczba bajt�w przeznaczonych na pr�bk� to warto�� pola BLKLEN pomniejszona o 2.
4 Bajt, kt�rego warto�� informuje o cz�stotliwo�ci z jak� d�wi�k by� spr�bkowany (SR). Przechowywan� w nim liczb� obliczy� mo�na korzystaj�c ze wzoru:
SR = 256- 1000000/f gdzie f to cz�stotliwo�� wyra�ona w Hz.
5 Bajt opisuj�cy metod� zastosowanej kompresji danych (PACK). Znaczenie r�nych warto�ci:
O - bez kompresji
1 - kompresja metod� 4-bit
2 - kompresjo metod� 2.6-bit
3 - kompresjo 2-bit
6 Pocz�tek ci�gu bajt�w pr�bki.
Typ 2 - Voice Continuation (kontynuacja)
Podblok przechowuj�cy dane b�d�ce kontynuacj� zapisanych w podbloku typu l. Ten typ podbloku przydatny jest w sytuacjach, gdy d�ugo�� zapisywanej pr�bki jest na tyle du�a, �e 3 bajty pola BLKLEN w podbloku l nie okazuj� si� nie wystarczaj�ce.
Przesuni�cie Opis
O Bajt BLKTYPE o warto�ci 2.
l Trzy bajty opisuj�ce d�ugo�� bloku (BLKLEN).
4 Pocz�tek ci�gu bajt�w pr�bki.
Typ 3 - Silence (cisza)
Podblok definiuj�cy okres ciszy. U�ycie podblok�w tego typu mo�e okaza� si� przydatne tam, gdzie zale�y nam na oszcz�dno�ci pami�ci dyskowej (tak�e operacyjnej na czas odtwarzania), a pr�bka d�wi�kowa zawiera okresy ciszy (przynajmniej wzgl�dnej).
ROZDZIA� 2
Przesuni�cie Opis
Bajt BLKTYPE o warto�ci 3.
Trzy bajty pola BLKLEN. Warto�� tego pola dla tego typu podbloku wynosi zawsze 3.
Dwubajtowe pole PERIOD okre�laj�ce czas trwania ciszy wyra�ony w jednostkach cyklu pr�bkowania (odwrotno�� cz�stotliwo�ci pr�bkowania wyra�onej wHz).
Bajt pola SR, kt�rego warto�� wyliczamy wed�ug wzoru przedstawionego przy opisie typu Voice Data.
Typ 4 - Marker
Funkcja podbloku tego typu jest do�� specyficzna. Mianowicie sterownik CT-VOICE, podczas odtwarzania d�wi�ku, modyfikuje s�owo statusowe warto�ci� przechowywan� w tym podbloku. Badanie s�owa statusowego pozwala wi�c sprawdzi�, kt�ra cz�� bloku danych pliku VOC jest aktualnie odtwarzana. U�atwi� lo wi�c mo�e realizacj� prezentacji graficzno-d�wi�ko-wych, gdzie kluczow� rol� spe�nia synchronizacja d�wi�ku z wy�wietlanym obrazem.
Przesuni�cie Opis
O Bajt BLKTYPE o warto�ci 4.
l Pole BLKLEN o d�ugo�ci trzech bajt�w i sta�ej warto�ci 2.
4 Dwubajtowy marker o warto�ci zawieraj�cej si� w przedziale (l.FFFEh).
Typ 5 - ASCII text (tekst ASCII)
W zasadzie funkcja tego podbloku ograniczona jest do przechowywania ci�gu znak�w ASCII. Zastosowanie tego typu jest raczej ograniczone (w zasadzie wy��cznie komentarze dodawane do zdigitalizowanych d�wi�k�w).
Przesuni�cie Opis
O Jednobajtowe pole BLKTYPE przechowuj�ce warto�� 5.
15
OBS�UGA PLIK�W VOC
l Pole BLKTYPE o d�ugo�ci 3 bajty i warto�ci r�wnej d�ugo�ci ci�gu znak�w ASCII powi�kszonej o l.
4 Pocz�tek ci�gu ASCII zako�czonego bajtem o warto�ci r�wnej 0.
Typ 6 - Repeat Loop (pocz�tek p�tli repetycji)
Je�eli zdarzy si�, �e jaki� d�wi�k chcemy odtwarza� cyklicznie wi�ksz� ilo�� razy, to idealnym rozwi�zaniem wydaje si� by� zastosowanie podbloku tego typu. Pozwala on na wielokrotne odtwarzanie pr�bki d�wi�kowej umieszczonej w podblokach umieszczonych po nim. Przy za�o�eniu, �e plik zawiera� ma odg�os (np. strza�u - do wykorzystania w grze zr�czno�ciowej) powtarzany cyklicznie n razy i zapisany w podbloku typu Voice Data, struktura tego pliku wygl�da� mo�e jak na rysunku 2.
Nag��wek pliku
BInkAmych
��^ Repeat Loop Vaice Dola
��� End Repeat Loop Terminator
Rys. 2 Struktura pliku VOC z p�tl� Repeat Loop Struktura podbloku Repeat Loop:
Przesuni�cie Opis
Typ bloku (BLKTYPE=6). Pole BLKLEN o warto�ci 2.
Dwa bajty przechowuj�ce licznik repetycji (COUNT). S�owo przechowywane w tym polu determinuje liczb� powt�rze�. Po napotkaniu podbloku End Repeat Loop sterownik CT-YOICE powt�rzy odtwarzanie nast�puj�cych po Repeat Loop COUNT razy. ��czna suma odtworze� jest wi�c r�wna COUNT+1. Warto wiedzie�, �e je�li zadana liczba powt�rze� r�wna b�dzie FFFFh, p�tla realizowana b�dzie bez ko�ca (tzn. a� do momentu u�ycia funkcji zako�czenia operacji - nr 8).
POZDZIA� 2
Typ 7 - End Repeat Loop
Podblok tego typu nale�y umie�ci� zaraz po ci�gu podblok�w, kt�re chcemy obj�� dzia�aniem p�tli zainicjowanej przez pod-blok typu Repeal Luop.
Przesuni�cie Opis
Pole BLKTYPE o warto�ci 7. Pole BLKLEN o warto�ci 0.
2.2 STEROWNIK CT-VOICE
Sterownik CT-VOICE (Crealive memory mod� Voice driver) jest do��czany, wraz z reszt� oprogramowania, do kart d�wi�kowych serii Sound Blasier. Jego kod znajduje si� w pliku CT-VOICE.DRV. Udost�pnia on programi�cie podstawowe funkcje zwi�zane z obs�ug� plik�w formatu VOC. Jego dost�pno�� jest warunkiem koniecznym do uruchomienia cz�ci oprogramowania. Przyk�adem mo�e tu by� edytor plik�w d�wi�kowych VEDIT korzystaj�cy podczas zapisu i odtwarzania d�wi�ku z jego funkcji. Jego umiejscowienie na dysku mo�emy zmieni�, nale�y Jednak odpowiednio zmodyfikowa� warto�� zmiennej �rodowiskowej SOUND.
SPOS�B KORZYSTANIA ZE STEROWNIKA
W pliku CT-VOICE.DRV znajduje si� kod sterownika CT-VOICE. Og�lnie rzecz bior�c, do jego funkcji odwo�ujemy si� umieszczaj�c przekazywane mu parametry w odpowiednich rejestrach i wywo�uj�c go assemblerow� instrukcj� CALL (dalek�). Wpierw musimy naturalnie za�adowa� go do pami�ci. Mechanizm odwo�ywania si� do jego funkcji przedstawia schematycznie rysunek 3.
17
OBS�UGA PLIK�W VOC
Kod naszego programu �� CALL FAR
Kod ster�wka CT Voice
JMP
Ci�g ASCII opisuj�cy' sterownik
Re|es'ry na stos <� Wykonanie 'unkc|i t-.piestryze s'osu RETF
Rys. 3 Mechanizm odwo�ywania si� do funkcji CT-YOICE Kolejno��, w jakiej musimy wykonywa� procedury przygotowuj�ce sterownik do dzia�ania, przedstawi� mo�na nast�puj�co:
1. Odszukanie pliku CT-VOICE.DRV. Je�eli nie ma go w aktualnym dla naszego programu katalogu, nale�y skorzysta� ze zmiennej �rodowiskowej SOUND, w kt�rej (pod warunkiem, �e u�ytkownik komputera umie�ci� odpowiedni� komend� w AUTOE-XEC.BAT) przechowywana jest �cie�ka do katalogu, w kt�rym znajduj� si� sterowniki do karty Sound Blasier.
2. Sprawdzenie rozmiaru pliku CT-VOICE.DRV- Testowanie wielko�ci pliku jest tutaj konieczne, gdy� rozmiary CT-VOICE.DRV dla r�nych wersji sterownika mog� si� do�� znacznie r�ni�.
3. Rezerwacja odpowiedniego obszaru pami�ci operacyjnej.
4. Wczytanie zawarto�ci pliku CT-VOICE.DRV do zarezerwowanego obszaru. Nale�y zwr�ci� uwag�, �e przesuni�cie pocz�tku kodu sterownika wzgl�dem pocz�tku zajmowanego przez niego segmentu musi by� r�wne 0.
5. Sprawdzenie, czy wczytany plik zawiera kod sterownika. Najpro�ciej wykona� to wykorzystuj�c fakt, �e w oryginalnym pliku CT-VOICE.DRV od pozycji 3 rozpoczyna si� ci�g znak�w; �CT-VO-ICE". Czynno�� sprawdzenia poprawno�ci przeprowadzi� mo�na oczywi�cie przed wczytaniem do pami�ci ca�ego pliku. Przyk�adowa procedura �adowania sterownika CT-V01CE zaimple-mentowana w j�zyku Turbo Pascal wygl�da� mo�e nast�puj�co:
Const
Sterownik w_pamieci:booiean=false:
{ czy ju� zatad3wali�my sterownik do pami�ci} var
ROZDZIA� 2
sterownik:pointer;
{ wska�nik pocz�tku kodu sterownika ustawiany przez } {funkcj� Przygot:UJ_sterownik}
Function Przygc)tuj_sterowmk:boolean;
Var
s:flle;
specyfikacja:string;
rozmianseg s,ofs^s:word;
Co_jest_sterownik:boo!ean;
Function lstnieje[Pl�k:stringi:boolean;
Var
f:file;
Begin
assigntf.Plik],
{Sl-}
reset[fl;
closetO;
{$!+} tstnieje:=[10result=03 End;
Begin
if Scerowntk_w_pamieci then exit:;
{ gdy wcze�niej za�adowany} specyfikacja:='CT-VOICE.DRV;
if not fscniejeCspecyfikacja) then
specyfikacja: =getE^vtlSaUNa'3+l\DRV\CT-VOICE.DRV';
{ gdy nie odnaleziony w bie��cym katalogu } if not IstniejeCspecyfikacja) then
begin
Przygotui_sterownik:=fa!se;
exit {nie udatosi�}
end;
assignts,specyfikacja);
reset[s,1); { otwieramy znaleziony plik } rozmiar:=fileSize[s); {pobieramy rozmiar} getmemCsterownik, rozmiar); { rezerwujemy pami�� } b!ockreadEs,sterownik^,filesize[s]]; {odczyt} cioseEs); {zamykamy plik} seg_s:=seg[ste^ow^ik/\]; {segment} ofs_s; ^fstsCerownik^ ], { przesuni�cie } toJest_sterownik:=[MemW[seg_s:ofs_s-3]=$5443);
{tutaj sprawdzili�my, czy wczytany plik zawiera kod }
{sterownika CT-YOICE} if not toJest_sterownik then begin
19
OBS�UGA PLIK�W VOC
Przygotu)_scerownik;=false;
freemem[sterownik,rozmiar]:
exic end:
Przygotu]^sterownik:=tnJe { Wszystko jest w porz�dku }
End;
Do wczytanego z pomoc� tej funkcji sterownika odwo�a� si� mo�na (przy za�o�eniu, �e na jego kod wskazuje zmienna Sterownik) np. tak:
as m
Tutaj nadajemy wybranym rejestrom odpowiednie warto�ci catl sterownik
Odczytujemy z rejestr�w zwr�cone przez funkcj� wyniki end;
Naturalnie, aby nasz program uczyni� bardziej uniwersalnym, mo�emy do��czy� do jego kodu zawarto�� pliku CT-VOICE.DRV na etapie konsolidacji. Wtedy zb�dna staje si� naturalnie jego obecno�� na dysku u�ytkownika. Programuj�cy w j�zyku Turbo Pascal post�pi� mo�e wg nast�puj�cego schematu:
1. Przygotowa� plik CT-VOICE.DRV u�ywaj�c do��czonego do kompilatora programu BINOBJ.EXE;
B1NOBJ CT-VOICE.DRV CT-YOlCE.OBJ Yoice
2. Przygotowa� bibliotek� zawieraj�c� procedur� zwi�zan� z kodem sterownika:
Unit VOCDrv; { nazwa przyk�adowej biblioteki} Interface
procedur� voice;
Implementatian
{$LcI:-voice.obj}
procedur� valce;
exCernal End.
3. Na pocz�tku naszego programu, w linii, w kt�rej wyszczeg�lniamy u�ywane biblioteki, po instrukcji USES dopisa� nazw� VOC-Drv (tak nazwali�my stworzon� w punkcie 2 bibliotek�).
ROZDZIA� 2
Do w��czonego w ten spos�b kodu sterownika odwo�ujemy si� korzystaj�c z mo�liwo�ci umieszczania w programie wstawek assem-blerowych:
asm
Wype�niamy parametran odpowiednie rejestry cali far ptrvoice Odczyt wynik�w z rejestr�w end:
Jakkolwiek by�my kodu sterownika nie umie�cili w pami�ci operacyjnej, jest jeszcze jedna rzecz, o kt�rej pami�ta� musimy. U�ywanie funkcji CT-VOICE wymaga uprzedniej rezerwacji jednego, szes-nastobitowego s�owa w pami�ci na zmienn� u�ywan� przez sterownik. Zmienna ta to Ct-Voice Status. Przechowuje ona warto�� dodatni� ca�kowit� (w Turbo Pascalu typ Word). imiennej tej sterownik mo�e wi�c nadawa� warto�ci z przedzia�u O - FFFFh. Modyfikacji jej warto�ci dokonuje w nast�puj�cych przypadkach:
1. Podczas inicjalizacji. Po wykonaniu funkcji 3 sterownik nadaje zmiennej statusowej warto�� 0.
2. Rozpoczynaj�c odtwarzanie/zapis danych d�wi�kowych (warto�� FFFFh).
3. W momencie zako�czenia operacji odtwarzania/zapisu danych d�wi�kowych (nadawana warto��: 0).
4. Gdy podczas odtwarzania bloku danych pliku d�wi�kowego sterownik natrafi na podblok typu Marker, wpisuje do zmiennej statusowej przechowywan� w nim warto��. Jak wspomnia�em przy opisie struktury pliku formatu VOC, u�ywaj�c podblok�w typu Marker, mo�emy podzieli� plik d�wi�kowy na kilka cz�ci i informacje odczytywane z Ct-Voice Status podczas odtwarzania wykorzysta� do synchronizacji d�wi�ku z dzia�aniami programu.
OM�WIENIE FUNKCJI STEROWNIKA
W tej cz�ci ksi��ki om�wi� udost�pniane przez sterownik CT-VO-ICE funkcje. Generalnie rzecz bior�c, ka�d� z nich wywo�uje si� jednakowo - przez wywo�anie dalekim CALL kodu sterownika. Numer funkcji oraz parametry dla niej umieszczamy w rejestrach mikroprocesora (w BX numer, w pozosta�ych parametry). Je�eli funkcja ma
OBS�UGA PUKOW VOC
21
zwraca� jakie� warto�ci, to na og� odczytujemy je z rejestru AX (w przypadku danej 4-bajtowej z pary DX:AX). Istotny jest fakt, �e warto�ci pozosta�ych rejestr�w (tak�e flagowego) s� zachowywane.
Funkcja B: Pobierz wersj� sterownika
Wej�cie: BX=0 Wyj�cie: AH - g��wny numer wersji
AL - mniej znacz�ca cz�� nuinem wersji
Opis: Funkcja zwraca numer wersji sterownika. Sprawdzenie wersji jest wskazane, je�eli nasz program wczytuje sterownik z dysku u�ytkownika.
Funkcja 1: Ustawienie adresu bazowego
Wej�cie: BX=1
AX- adres bazowy Wyj�cie: brak
Opis: Ta funkcja pozwala na ustawienie portu we/wy u�ywanego przez sterownik do komunikacji z kart�. Je�eli nasz program korzysta z tej funkcji, to powinien wywo�a� j� jako pierwsz�. Dost�pne warto�ci adresu bazowego to:
210h, 220h, 230h, 240h, 250h i 260h (dla kart Sound Bla-ster 2.0 dopuszczalne warto�ci to 220h i 240h). Warto, by program umo�liwia� u�ytkownikowi wyb�r adresu. Nale�y zwr�ci� uwag�, �e warto�ci� domy�ln� (ustawion� za pomoc� zworek na karcie przez producenta) jest 220h. Taki le� adres b�dzie u�ywany przez sterownik w wypadku, je�eli nasz program nie odwo�a si� do lej funkcji.
Funkcja 2: Ustawienie numeru przerwania dla DM�
Wej�cie: BX=2
AX= numer przerwania
Wyj�cie: brak
Opis: U�ywaj�c tej funkcji program mo�e ustawi� numer iinii IRQ u�ywanej przez kart� Sound Blaster do sygnalizacji ko�ca transmisji danych. Funkcja ta powinna by� (je�li wyst�pi�a potrzeba jej u�ycia) wywo�ana zaraz po funk-
ROZDZIA� 2
cji numer l (ustawienie adresu bazowego). Warto�ci, jakie przekaza� mo�emy jako parametr, to 2, 3, 5 i 7. Domy�lny numer przerwania IRQ to 7.
Funkcja 3: Inicjalizacja sterownika
Wej�cie: BX=3
Wyj�cie: AX = O, gdy wszystko przebieg�o pomy�lnie,
1 - b��d karty Sound Blaster
2 - b��d operacji zapisu/odczytu (�le ustawiony adres bazowy)
3 - b��d przerwania
Opis: Program powinien wywo�ywa� l� funkcj� przed skorzystaniem z pozosta�ych (oczywi�cie pomijaj�c funkcje zmiany adresu bazowego i numeru przerwania IRQ). Zwr�cona w rejestrze AX warto�� wskazuje, czy procedura inicjalizacji przebieg�a bezb��dnie. W przypadku wykrycia b��du dzia�anie naszego programu powinno by� przerwane. Bardzo istotnym jest fakt, �e po inicjalizacji sterownika uk�ad DA� zostaje w��czony (konwersja danych cyfrowych do postaci analogowej). W zasadzie wy��cznie funkcje 0-2 mog� by� wywo�ywane przed wykonaniem procedury inicjalizacji. Z funkcji inicjalizacji korzystamy jednorazowo.
Funkcja 4: W��cz/Wytocz DA�
Wej�cie: BX=4
AL=0, aby wy��czy� AL = l, aby w��czy� DA� Wyj�cie: brak
Opis: Korzystaj�c z funkcji mo�na w��cza� i wy��cza� uk�ad DA� odpowiedzialny za konwersj� danych cyfrowych do postaci analogowej. Pozostawienie DA� w stanie w��czonym na czas zapisu d�wi�ku do pami�ci powoduje, �e jednocze�nie z zapisem dane kierowane s� tak�e na wyj�cie, co powodowa� mo�e powstawanie dodatkowych szum�w podczas samplingu. Dlatego przed rozpo-
OBS�UGA PLIK�W VOC
23
cz�ciem zapisu d�wi�ku (funkcja 7) nale�y wy��czy� DA�. Pisz� o wy��czaniu uk�adu DA�, mimo �e w rzeczywisto�ci chodzi w�a�ciwie o od��czenie wzmacniacza na jego wyj�ciu. Z punktu widzenia programisty nie ma to jednak �adnego znaczenia.
Funkcja 5: Ustaw adres zmiennej statusowej
Wej�cie: BX=5
ES:DI == adres s�owa w pami�ci operacyjnej przeznaczonego na zmienn� Ct-Voice Status
Wyj�cie: brak
Opis: Sterownik CT-VOICE modyfikuje podczas dzia�ania poszczeg�lnych funkcji szesnasiobitowe s�owo, kt�rego adres mo�e wskaza� korzystaj�cy ze sterownika program. Om�wienie funkcji zmiennej z nim zwi�zanej znalaz�o si� w rozdziale �Spos�b korzystania ze sterownika".
Funkcja 6: Rozpocznij odtwarzanie d�wi�ku
Wej�cie: BX=6
ES:DI = adres bufora Wyj�cie: brak
Opis: Funkcja rozpoczyna odtwarzanie d�wi�ku z wykorzystaniem uk�adu DM�. Zaraz po jej wywo�aniu sterownik wpisuje do zmiennej statusowej warto�� FFFFh. Po rozpocz�ciu odtwarzania sterownik oddaje sterowanie programowi wywo�uj�cemu, zaraz po czym nasz program zaj�� si� mo�e realizacj� innych zada� (w grach i programach prezentacyjnych np. animacj�). Dane przeznaczone do odtworzenia z pomoc� tej funkcji musz� by� zapisane w formacie przyj�tym przez Creative Labs Inc. (opis w rozdziale �Struktura pliku VOC"). Uwaga: para rejestr�w ES:DI wskazywa� musi nie na pocz�tek pliku umieszczonego w pami�ci, ale na pocz�tek Bloku Danych tego pliku. Przypominam tu, �e pocz�tek b�oku danych znale�� mo�emy odczytuj�c s�owo o przesuni�ciu 20 wzgl�dem pocz�tku nag��wka. Badaj�c warto��
ROZDZIA� 2
zmiennej o adresie ustawionym funkcja 5 sprawdza� mo�emy, czy plik d�wi�kowy jest odtwarzany, czy te� procedura odtwarzania zosta�a ju� zako�czona (w�wczas warto�� zmiennej statusowej jest r�wna 0). Nale�y pami�ta�, �e jednocze�nie odtwarza� mo�na wy��cznie jeden plik i w momencie, gdy chcemy rozpocz�� odgrywanie nast�pnego, musimy u�y� funkcji 8 (zatrzymanie operacji).
Funkcja 7: Rozpocznij zapis d�wi�ku
Wej�cie: BX-7
AX = cz�stotliwo�� pr�bkowania DX:CX = rozmiar bufora
ES:Dl = adres bufora przeznaczonego na sk�adowanie odczytanych z przetwornika analogowo-cyfrowego danych
Wyj�cie: brak
Opis: Funkcja pozwala na zapis danych z przetwornika A/C do rozpoczynaj�cego si� od kom�rki wskazywanej przez par� ES:Dl bufora o rozmiarze zadanym warto�ciami rejestr�w DX:CX. Sterownik CT-YOICE u�ywa uk�adu DM�, a co za tym idzie, zapis d�wi�ku odbywa si� (podobnie jak odtwarzanie) �w tle". Zmienna statusowa zapisywana jest po rozpocz�ciu pr�bkowania warto�ci� FFFFh i, po jego zako�czeniu, warto�ci� 0. Jednym z parametr�w, jakich oczekuje funkcja, jest cz�stotliwo�� pr�bkowania podawana w rejestrze AX. Zakres, w jakim mie�ci� si� ona mie�ci�, jest �ci�le zwi�zany z typem karty. I tak dla Sound Blaster'a w wersjach l.x maksymalna warto�� wynosi 12000, a dla karty Sound Blaster w wersji 2.0 najwi�ksza mo�liwa cz�stotliwo�� wynosi 15000. W obu przypadkach minimalna warto�� to 4000.
Funkcja 8: Zako�czenie operacji We/Wy
Wej�cie:
Wyj�cie:
BX=8 brak
25
OBS�UGA PLIK�W VOC
Opis: Funkcja przerywa odtwarzanie (zapis) d�wi�ku i nadaje zmiennej statusowej warto�� 0.
Funkcja 9: Zako�czenie pracy ze sterownikiem Wej�cie:BX==9 Wyj�cie: brak
Opis: Funkcja deinicjalizuje kart� d�wi�kow� i wy��cza uk�ad DA�, Program powinien wywo�ywa� j� ko�cz�c dzia�anie.
Funkcja 10: Zawie� odtwarzanie d�wi�ku
Wej�cie: BX=10
Wyj�cie: AX = O, gdy operacja przebieg�a prawid�owo AX = l, gdy �aden plik nie by� odtwarzany
Opis: Funkcja pozwala na zawieszenie odtwarzania d�wi�ku (pauza). Warto�� zmiennej statusowej zachowuje swoj� warto��. Je�li wywo�amy t� funkcj� w przypadku, gdy procedura odtwarzania nie by�a aktywna, zwr�con� w AX warto�ci� b�dzie l.
Funkcja 11: Wzn�w odtwarzanie d�wi�ku
Wej�cie: BX=11 Wyj�cie: AX = O, gdy wszystko w porz�dku
AX = l, gdy odtwarzanie nie zosta�o zawieszone
Opis: Funkcja s�u�y do wznowienia zawieszonego przy u�yciu funkcji 10 odtwarzania d�wi�ku.
Funkcja 12: Przerwij p�tl�
Wej�cie: BX==12
AX-= l, aby zako�czy� natychmiastowo AX== O, gdy chcemy, aby sterownik odworzy� powtarzany p�tl� blok do ko�ca
Wyj�cie: AX=0, gdy operacja przebieg�a pomy�lnie AX= l oznacza, �e p�tla nie by�a aktywna
ROZDZIA� 2
Opis: Format VOC pozwala na zdefiniowanie p�tli odtwarzania. Podbloki umieszczone mi�dzy podblokiem typu 6 a podblokiem typu 7 b�d� odtwarzane cyklicznie zadan� liczb� razy. Je�eli wykonywanie p�tli chcieliby�my z jakich� powod�w przerwa�, u�yteczna okazuje si� by� w�a�nie funkcja 12. Zako�czenie p�tli mo�e przebiega� na dwa sposoby: pierwszy (AX=1) polega na tym, �e sterownik natychmiast �przeskakuje" do podbloku nast�puj�cego po p�tli, drugi (AX=0) polega na tym, �e sterownik ko�czy odtwarzanie podblok�w obj�tych dzia�aniem p�tli i (nie zwa�aj�c na warto�� licznika repelycji) rozpoczyna odtwarzanie nast�pnych danych.
Funkcja 13: Ustawienie pu�apki u�ytkownika
Wej�cie: BX=13
DX:AX== adres procedury u�ytkownika Wyj�cie: brak
Opis: Sterownik CT-VOICE umo�liwia wskazanie procedury, kt�ra wywo�ywana b�dzie ka�dorazowo, gdy rozpoczynane b�dzie odtwarzanie nowego podbloku. Sterownik przekazuje naszej procedurze adres nowego podbloku w parze rejestr�w ES:BX. Przy jej tworzeniu zadba� musimy o spe�nienie kilku warunk�w:
� ko�czy� si� powinna instrukcj� assemblera RET (dalek�);
� zachowywa� warto�ci wszystkich rejestr�w (tak�e rejestru flagowego, ale z pomini�ciem wska�nika przeniesienia);
� wska�nik przeniesienia rejestru flagowego procedura powinna zerowa�, gdy chcemy, by nowy podblok by� odtworzony (gdy nie chcemy - powinna go ustawi�);
� powinna zerowa� wska�nik przeniesienia, gdy nowy podblok jest podblokiem ko�cz�cym (Terminator).
Je�eli chcemy zabroni� wywo�ywania naszej procedury, wystarczy wywo�a� funkcj� 13 zeruj�c uprzednio rejestry AX i DX (wskaza� adres 0:0).
27
OBS�UGA PLIK�W VOC
ZASADY KORZYSTANIA Z FUNKCJI
Zanim zaczniemy wykorzystywa� podane funkcje sterownika CT-V01CE. musimy pozna� kilka elementarnych zasad, jakich powinni�my si� trzyma� przy wykorzystaniu go. Najpro�ciej b�dzie, gdy zaprezentuj� schematy, wg kt�rych post�powa� nale�y chc�c rozpocz�� lub zako�czy� prac� ze sterownikiem, odtworzy� pr�bk� d�wi�kow� lub zapisa� d�wi�k.
Rozpoczynanie pracy:
1. Rezerwacja pami�ci i wczytanie do niej sterownika.
2. Je�li jest to konieczne, modyfikacja adresu bazowego z wykorzystaniem funkcji l.
3. Zmiana numeru przerwania IRQ przy pomocy funkcji 2.
4. Inicjalizacja sterownika - wywo�anie funkcji 3.
5. Ustawienie adresu zmiennej statusowej. Oczywi�cie wykonanie czynno�ci 2 i 3 jest opcjonalne - je�eli nie zostan� wykonane, przyj�te zostan� domy�lne warto�ci numeru przerwania oraz adresu bazowego.
Zako�czenie pracy:
1. Wywo�anie funkcji 9 - deinicjalizacja sterownika.
2. Zwolnienie pami�ci operacyjnej przydzielonej sterownikowi.
Odtwarzanie d�wi�ku:
1. Rezerwacja odpowiedniego obszaru pami�ci operacyjnej i wczytanie do niego zawarto�ci pliku d�wi�kowego VOC.
2. Odczytanie szesnastobitowego s�owa o przesuni�ciu 20 wzgl�dem pocz�tku pliku. Jego warto�� okre�la d�ugo�� nag��wka.
3. W��czenie uk�adu DA� (funkcja 4). Je�eli odtwarzamy d�wi�k zaraz po inicjalizacji sterownika, czynno�� t� mo�na pomin��.
4. Wywo�anie funkcji 6 (odtworzenie d�wi�ku) z podaniem w parze rejestr�w ES:DI wyznaczonego adresu pocz�tku bloku danych.
5. Czeka� na moment w kt�rym zmiennej statusowej nadana zostanie warto�� O (koniec). Podczas oczekiwania na zako�czenie odtwarzania nasz program mo�e wykonywa� inne czynno�ci. U�ywaj�c funkcji 10 i 11 mo�emy zatrzymywa� i wznawia� wykonywanie procedury odtwarzaj�cej a wywo�uj�c funkcj� 8 - zako�czy� jej dzia�anie. Odczytuj�c warto�� zmiennej statuso-
ROZDZIA� 2
wej mo�emy, pod warunkiem uprzedniego wzbogacenia naszego pliku o podbloki typu Marker, sprawdzi�, kt�ry fragment pr�bki d�wi�kowej jest aktualnie odtwarzany.
Zapis d�wi�ku:
2.
3.
4.
Rezerwacja pami�ci przeznaczonej na bufor danych. Wy��czenie uk�adu DA� (funkcja 4). Wywo�anie funkcji zapisu danych (nr 7). Oczekiwanie na zako�czenie zapisu. Proces mo�emy przerwa� z pomoc� funkcji 3. Osi�gni�cie ko�ca bufora lub koniec zapisu spowodowany wykonaniem funkcji 8 sterownik sygnalizuje nadaniem zmiennej statusowej warto�ci 0. Jako ostatni� czynno�� uwa�a� mo�na zapis spr�bkowanego d�wi�ku do pliku. Nale�y tu pami�ta�, �e utworzony przez sterownik blok danych poprzedzi� nale�y spreparowanym odpowiednio nag��wkiem.
BIBLIOTEKA VOC.TPU
W rozdziale tym prezentuj� wersj� �r�d�ow� przyk�adowej biblioteki gotowej do skompilowania przy u�yciu kompilatora Turbo Pascal w wersji 6.0 lub nowszej- Posiadacze starszych wersji mog� w prosty spos�b zmodyfikowa� tekst biblioteki (przez zamian� wstawek assemblerowych typu ASM na INLINE). Przy tworzeniu procedur g��wny nacisk postawi�em na czytelno�� i zrozumia�o��. Poniewa� pe�en tekst biblioteki znajdzie Czytelnik na do��czonej do ksi��ki dyskietce w pliku VOC.PAS, listing zamieszczony w ksi��ce pozwoli�em sobie przerywa� komentarzami. unit;\/OC:
interface
typeVRodzajBledu=tVOk,
YBrakSterowniks,
YZaMaloPamieci,
YZ�yNaglowekSterownika,
YBIadInicjelizacji,
YUszkodzonaKarta,
YBIadWeWy,
VZIyNumepPrzerwaniaD!aDMA,
YBIadZwolnienia,
YBrakPIiku,
VToNieVOC,
OBS�UGA PLIK�W VOC
29
Typ VRodzajBledu jest typem wyliczeniowym i okre�la wi�kszo�� b��d�w, jakie mog� pojawi� si� podczas realizacji zaimplemetowanych w bibliotece procedur. Poni�ej zadeklarowana zosta�a zmienna VOC_Blad typu VRodzajBledu, kt�rej zadaniem b�dzie przechowanie nadanej w trakcie realizacji procedur (funkcji) warto�ci. Naturalnie taki spos�b opisania b��d�w (typem wyliczeniowym) mo�e si� komu� wydawa� nienaturalny, ale moim zdaniem, przyczyni si� on znacznie do zwi�kszenia przejrzysto�ci prezentowanego tekstu.
var
VOC_Blad:VRod2ajBledu;
\/OCSCatus:word;
\/SterownikZainstalowany;Boo[ean;
VDIugoscNag!owka:byte;
Opr�cz zmiennej VOC_BLAD w�r�d globalnych zmiennych udost�pnianych przez bibliotek� znalaz�y si�: VOCStatus (zmienna statusowa, kt�rej lokalizacj� w RAM wska�emy sterownikowi), VSterownik-Zainstalowany typu Boolean (informacja o tym, czy CT-VOICE zosta� ju� wczytany do pami�ci operacyjnej) oraz VDlugoscNaglowka (jak sama nazwa wskazuje, przechowamy tam wielko�� potrzebn� przy wyliczaniu pozycji bloku danych pliku VOC).
procedure VlnicjujSterownik[Port,lrq:word3;
function VWersjaSterownika:word;
procedur� YWylaczDAC:
procedur� YWIaczDAC;
procedur� VOdczyta|PlikVOC(var bufor:pointer;spec:string);
procedur� VZarezerwujPamiec(var gdzie:painter;ile:longint);
procedur� VZwolnijPamiectgdzie:pomter);
function VOpisBledu:string;
procedur� YDeinstatuJSterownik;
procedur� VOdtworzVOC[buror;pointer);
procedur� VOdtwor'zJeszczeRaz(bufor;poinCer];
procedur� VZakonczOperacjeVOC;
procedur� VPauzaVOC;
procedur� VKanCynuuiOdtwarzanieVOC;
procedur� VPrzerwijPet!eVOC[iak:word);
procedur� VZapiszBlokEczesc:word;dlug;word;p'poincer);
procedur� VOdtworzBloktwsk:pointer];
ROZDZIA� 2
W cz�ci implementacyjnej zadeklarowa�em u�ycie dw�ch zmiennych globalnych: VSTEROWNIK (przechowa wskazanie na obszar zajmowany przez kod CT-VOICE) oraz VDawnaProceduraWyjscia (wykorzystywana do przechowania zastanej warto�ci ExitProc). Zmienna VSTEROWNIK jest u�ywana przez wszystkie (za wyj�tkiem VOpisBledu) wymienione w cz�ci interface procedury i funkcje. Nale�y zwr�ci� uwag�, �e przed wykonaniem procedury VInicjujSte-rownik ma warto�� nieokre�lon�, a co za tym idzie, niedopuszczalne wtedy jest wykonanie jakiejkolwiek innej funkcji (procedury). irnplemenCaton
uses dos.crt;
var
Vsterawnik:pointer;
VDawnaProceduraWyj'scia:pointer;
function lsCnieJe[Plik:string):boolean:
var
f:file;
begin
assign[f,P!ik);
{$!-} resetCfl;
closetf];
{$!+} lstnieje:=(!OresulC=03 end;
procedur� VZarezerwujPamiec(var gdzie:pointer;i!e:longint);
var
rregisters:
ilasc:word;
begrn
i
ilosc:=[ile+15) shr4; {ile paragraf�w} rah:=$48; {numer ustugi DOS-u } rbx;=ilosc;
MsDosCr);
if Crbx<>ilosc) Chen VOC_blad:=VZaMaloPamieci e!se begin
VOC_blad:=VOk;
gdzie:=pt;rtr.ax,G) end
end:
31
OBS�UGA PLIK�W VOC
Procedura YZarezerwujPamiec wywo�ywana jest z pozosta�ych w celu allokacji zadanego obszaru pami�ci operacyjnej. Jej parametry to zmienna typu Pointer, pod jak� postawione zostanie wskazanie 'na zarezerwowany fragment RAM, oraz zmienna typu Longint specyti-kuj�ca rozmiar potrzebnego obszaru. Procedura allokuje wielokrotno�� 16 bajt�w. W przypadku wyst�pienia b��du zmiennej VOC_BLAD nadaje warto�� VZaMaloPamieci. Zdefiniowana poni�ej procedura VZwolnij Pami�� zwalnia wskazywany przez parametr obszar.
prxedureVZwolni)P3miecCgdzie:point,er);
var
p:registers;
besm
nah:=$49;
nes;=segtgdzie^3:
msdostr);
if (rax=7)or[nax=93 Chen VOC_blad:=VBIadZwolnienia end;
procedur� VlnicjufSterownik(Port,lrq:word];
var
s:file;
specyfikacja:strlng;
seg_SiOfs_s:word, status_seg,status_ofs:word;
toJest_sterownik:bDolean;
wynik:word;
begin
if YSterownikZainstalowany then exit;
specyfikacja: ='0^0^. DRV1;
if not IstniejeCspecyfikscja) then
specyfikacja: =getEnv('SOUND�)+l\DRV\CT-VOICE.DRV':
if not IsCnieJsCspecyfikscja] then
begin
VQC_Blad:=VBrakSterownika:
exit
end:
assignis,specyfikacja), reset(s,1);
VZarezer'wuJPamiec[Vsterownik,fileSi2e(sl);
ifVOC_blad<>VOkthenexit;
blockreadts.Ysterownik^.filesizets]);
closets);
seg_s:=seg[Vste^townik/');
ofs_s:=ofs(Vsterownik^];
tOJest;_sCerownik:=[MemW[seg_s:ofs_s+3]=$5443];
ROZDZIA� 2
S not tOJest_sterown ik Chen begir VCC^b[ad;=VZ!yNaglawekSt;erownika;
exit end, if porcoO then asm
mov bx,1 mov ax,port callVst;erowmk end;
if irq<>0 then asm
movbx,2 mov ax,irq ca��Ystercwnik end, StaCus_seg:=segtVOCstaCus);
Stat:us_ofs:=ofs[VOCsC3tus];
asm
mav bx,3 cali Ysterownik mov wynik,ax mov bx,5
mov es,status_seg movdi,staCusJ)fs cali Ysterownik end;
case wynik of
0:VOC_blad:=VOk;
1: VOC_btad:=VL)szkodzonakarta;
2: VOC_blad:=VBladWeWy;
3: VOC_blad:=VZIyNumerPrzerwaniaDlaDMA
end;
end;
Procedura VInicjujSterownik spe�nia kluczow� rol� w bibliotece. Jej dzia�ania polega na wczytaniu kodu sterownika i jego inicjalizacji. Dodatkowo, podaj�c parametry r�ne od O mo�emy spowodowa� zmian� adresu bazowego i numeru u�ywanego podczas transmisji przerwania. Ko�cowy fragment procedury odpowiedzialny jest za wskazanie sterownikowi lokalizacji s�owa przeznaczonego na zmienn� statusow�. Zdefiniowana poni�ej funkcja YWersjaSterownika zwraca warto�� typu WORD, kt�rej bardziej starszy bajt odpowiada bardziej znacz�cej cz�ci numeru wersji, a m�odszy - mniej znacz�-
33
OBS�UGA PLIK�W VOC
�ej. Procedury VWyIaczDAC i YWIaczDAC odpowiadaj� za w��czanie i wy��czanie uk�adu konwersji DA�.
function YWersjaSte r�wnika,vwrd;
var
begin
asm
mov bx,0
cali Ysterownik
niovw,ax
end;
VWer'SjaSterownjka:=w
end;
procedur� YWylaczDAC;
assembler;
asm
mDV bx,4 mov al,0 cal!Vscerownik
end;
procedur� VWIaczDAC;
assembler;
asm
movbx,4
mov al,1
ca��Ysterownik end;
Ni�ej znalaz�a si� definicja procedury VOdczytajPlikVOC. Oczekuje ona podania zmiennej wska�nikowej, kt�rej zostanie nadana warto�� odpowiadaj�ca wskazaniu zajmowanego przez plik obszaru oraz podania specyfikacji pliku d�wi�kowego, kt�ry chcemy wczyta�. Sprawdzenie, czy mamy do czynienia z plikiem formatu VOC polega tu na przyr�wnaniu s�owa z�o�onego z dw�ch pierwszych bajt�w pliku do 7243h (znaki �C" i �r" z napisu �Creative Voice File"). procedur� VOdczycajPlikVOCCvarbufarpointer;spec;st ring];
var
plik_VQC:file;
rozmiar_pliku:longlnt;
Blokow:wor'd;
wynik:word;
miejsce.pointer;
bogi� ifnoC IsCmejeEspec] then
ROZDZIA� 2
beoHi VOC_Blad-=VBrakPliku:
exit end;
assign(plik_VOC.spec]:
re5et;(p!ik_VOC,1);
rozmiar_pliku:=fileSize(plik_VOC);
VZarezerwuiPamiecEbufor,rozmiarJ3liku3;
if VOC_blad< >VOk chen exit:
Blok�w: =0:
repeat
miejsce: =Pt^[seg(bufo^A)+Blokow�4096,ofs(bufo^'^]];
blockread[plik_VOC,miejsce" $FFFF,wynik);
lnc(B!okow3 untilwynik=0;
close(plik_VOC]:
if MemW[seg(bufo^�^]:ofs(bufo^-^)]<>$7^43
then VOC_blad:=VToNieVOC;
yDlugoscNagiawki^MemCsegtbufor^hofstbufor^l+^a]
end;
No i najwa�niejsze - odtworzenie wczytanego pliku - procedura VOdtworzVOC. Warto zwr�ci� uwag�, �e przesuni�cie w adresie segmentowym przekazywanym sterownikowi powi�kszane jest o rozmiar nag��wka wczytanego pliku.
procedur� VOdtwor2VOC(bufor:poini;er);
var
buf_s,buf_o:word;
begin
bu^s^segr�ufor^�;
bufJ^ofsCbufor^+YDIugascNaglowka;
YWIaczDAC;
as m
movbx,6 moves,buf_s movdi,buf_o ca��Ysterownik
end
end;
W bibliotece zdefiniowa�em tak�e drug� procedur� odtwarzaj�c� wskazywan� zadan� zmienn� pr�bk� (VOdtworzJeszczeRaz). Jedyna r�nica mi�dzy ni� a procedur� VOdtworzVOC polega na pomini�ciu w VOdtworzJeszczeRaz w��czania uk�adu DA�.
procedur� VOdt;worzJeszczeRaz[bufor:pointer);
var
but s,but o:word;
OBS�UGA PUK�W VOC
35
buf_s;=seg[bufor^);
buf o^ofstbufor^l+YDlugoscNaglowkE aem
movbx,6
moves,buf_s
movdi,buf_o
cali Ysterownik end
end;
Procedura YZakonczOperacje mo�e by� u�ywana zawsze, gdy chcemy zako�czy� odtwarzanie lub zapis d�wi�ku. Procedury VPauza-VOC i VKontynuujOdtwarzanieVOC s�u�� do chwilowego zawieszania i wznawiania odtwarzania.
procedur� VZakonczOperacjeVOC;
assembier;
as m
mov bx,8 ca!!Vsterownik
end;
procedur� VPauzaVOC:
var
odp;word;
begin as m
mov bx, 10 cali VsCerownik movodp,ax end;
ifodp=1 then voc^b[ad:=VSBNieOdCwarzal end;
procedur� VKontynuujOdtwarzanieVOC;
var
odp:wor'd:
begin as m
mov bx, 11 cali Ysterownik movodp,ax end;
if odp=1 chen VOC_blad:=VSBNieOdCwarzal end;
procedur� VPrzerwiJPetteVOCCiak:word);
ROZDZIA� 2
begin
end;
odp:word;
i [fnot[jakin[0,1I]theniak:=1;
asm
mav bx,12
movax,jak
cali Ysterowmk
movodp,ax end:
ifodp=1 thenVOC_blad:=VNieByloPetli
W bibliotece znalaz�a si� tak�e procedura zapisu d�wi�ku do pami�ci operacyjnej. Jako parametr�w oczekuje ona dw�ch wielko�ci typu WORD okre�laj�cych cz�stotliwo�� pr�bkowania d�wi�ku oraz rozmiar bufora oraz wskazania na bufor przeznaczony na zapis danych. Nale�y pami�ta�, �e po dokonaniu zapisu we wskazanym buforze znajdowa� si� b�dzie wy��cznie blok danych i, przed ewentualnym zapisem do pliku, nale�y poprzedzi� go nag��wkiem.
procedur� VZapiszBlok[czest:word;dlug:ward;p: point�?];
begin
ifczest<400Cthen begin
VOC_blad:=VZIaCzestotliwosc;
exit end:
YWylaczDAC;
asm
movbx,7 mavax, cze�� movdx,0 movcx,dlug les di,p callVsterownik end end;
Poni�sza procedura stanowi pewne uzupe�nienie zestawu narz�dzi s�u��cych odtwarzaniu d�wi�ku. VOdtworzBlok pomija wielko�� nag��wka przy wskazywaniu sterownikowi bufora z danymi, a co za tym idzie, doskonale nadaje si� do odgrywania zapisanego z u�yciem VZapiszBlok bloku danych.
procedur� VOdtworzBIok(wsk:pointer);
var
37
OBS�UGA PLIK�W VOC
przechowa) :byte:
begin
przechowaj :=VDIugoscNaglowka;
V0ugosc^aglowka:=0;
VOdtworzVOC(wsk);
VDIugoscNaglowka:= przechowaj
end
Funkcja VOpisBledu pe�ni rol� pomocnicz�. Zwraca �a�cuch ASCII opisuj�cy b��d zwi�zany z aktualn� warto�ci� zmiennej VOC_BLAD.
function VOpisBledu:sCring;
begin
case VOCJ)lad of
V0k:
VapisBledu;='Ok.';
YBrakSterownika:
VopisBledu:='Nie znaleziono pliku CT-VOICE.ORV';
VZaMaloPamieci:
VopisBledu:='ZbyC ma�o pami�ci operacyjnej.':
VZIyNaglowekSterownika:
VapisB!edu:='Zty nag��wek CT-VOICE.DRV';
YBIadInicjalizacji:
VopisBledu:='B�ad podczas inicjalizacji sterownika.';
VL)szkodzonaKarta:
VopisBledu:='Bt�dne dzia�anie karty d�wi�kowej.';
VBladWeWy:
VopisBledu:='Btad podczas zapisu/odczytu z port�w karty,';
YZ�yNumerPrzerwaniaDlaDMA:
VopisBledu:='Niew�a�ciwy numer przerwania IRQ.';
YBIadZwolnienia:
VopisBledu:='B��d zwolnienia pami�ci.';
YBrakPtiku:
VopisBledu;='BrBk pliku .VOC.';
VToNieVOC:
VopisBledu:='B��dny nag��wek pliku .VOC,';
VSBNieOdtwarzal:
VopisBledu:='�aden plik nie byt odtwarzany1;
VNieByiaPecli:
VopisBledu:='Nie by�o aktywnej p�tli.';
VZtaCzestotliwosc:
VopisBledu:='Zta cz�stotliwo�� pr�bkowania,' end end;
Ostatni� publiczn� procedur� biblioteki jest VDeinstalujSterownik. Mo�na j� wywo�a� w programie, by deinicja�izowa� CT-VO�CE i zwolni� zajmowan� przez jego kod pami��. Jego wywo�aniem
ROZDZIA� 2
w przypadku zako�czenia dzia�ania programu zajmie si� nowa procedura wyj�cia - VOCExit.
procedur� YDanstalujScerownik;
begm
(f YSterownikZainsCalowsny then begin as m
mov bx,9 ca��Ysterownik end;
VZwolni|PamiectVsterownik);
VSt:erownik2ainsCalowany:=false end end;
($F+) procedur� VOCExtt:;
begin
YOeinscalujScerownik;
ExitProc:==VDawnaProceduraWyjscia end;
{SF-}
begin
VDawnaProceduraWyJscia;=ExitProc;
ExitProc:=@VOCExit:
VSterown ikZainsCalowany: = False;
VOCstaCus:=0;
VOC 81ad;=VOk
end.
PRZYK�ADY
W poprzednim rozdziale zaprezentowa�em kompletn�, gotow� do u�ycia bibliotek� funkcji i procedur u�yteczn� przy programowaniu obs�ugi plik�w VOC. Aby bardziej jeszcze rozja�ni� zasady korzystania ze sterownika, przedstawi� przyk�ad programu wykorzystuj�cego jego us�ugi. Jego zadaniem b�dzie odtwarzanie zawarto�ci zadanego parametrem pliku formatu VOC:
program Zagraj;
{$M 16000,0,50000} uses crt.YOC:
var
b:pointer;
39
OBS�UGA PLIK�W VOC
procedur� koncZJesli_zle;
begin
lfVOC_Btad<>VOkthen begin
wnteln[VapisBledu);
halt end end:
begin
if paramcount<>1 then begin
wricelnC U�ycie: ZAGRAJ plik');
wriceinfplik - plik w formacie VOC');
halt end;
Vlnic}ujSCerownik(0,0);
ko�cz (esli_zle:
VOdczytaJPlikVOC[b,paramstrE13);
koncz_jesli_zle;
VOdCworzVOCEb);
wricelnrOdtwarzam. Wci�nij ESC aby przerwa�...');
repeat untii tkeypressed3orfVOCStatus=0);
if keypressed then VZakonczQperacjeVOC
end,
Wspomnia�em, �e parametrami dla VInicjujSterownik mog� by� (w przypadku, gdy ustawienia karty nie s� standardowe) adres bazowy i numer przerwania IRQ. Warto by�oby, aby nasze programy, zanim zainicjuj� dzia�anie sterownika, sprawdzi�y je. Jednym ze sposob�w jest odczytanie warto�ci zmiennej �rodowiskowej BLASTER. Oczywi�cie w przypadku, gdyby w pami�ci komputera, na jakim uruchomiony zosta� nasz program, nie znajdowa�a si� zmienna o tej nazwie, mo�emy np. zwr�ci� si� z zapylaniem do u�ytkownika (spos�b praktykowany - przekona� si� o tym mo�na przygl�daj�c si� kilku popularnym grom). Innym sposobem jest badanie ka�dego z port�w i przerwa�. Ta metoda zostanie om�wiona w dalszej cz�ci ksi��ki. Poni�ej przedstawiam proste funkcje zwracaj�ce interesuj�ce nas warto�ci po uprzednim odczytaniu ich ze zmiennej BLASTER:
function adres_bazowy:word;
var
lancuch.string;
pozycja:byte;
begin
ROZDZIA� 2
�a�cuch: =GeCEnvt'8LAS7OT:
if Uancucho"] then pozycjB:=pos['A', �a�cuch)
elsepozycja:=0, if pozycJaoOchen begm
ad^es_bazowy:=256fr[o^d[l6^cuch[pozycja-1]]-4B] +^6�[o^d[lancuch[pozyc^a+^])-4B] +ord([ancuch[pozycja+3])-48 end else adres_bazowy:=$220 end;
function numer_IRQ:byte' var
lancuch:string;
pozycja;byte;
begin lancuch:=SetEnv['BL�STER'];
if [lancucho") Chen pozycja:=pas(T.lancuch] else pozycja:=0;
ifpozycjaoOthen
numer_IRQ:=ord[lancuch[pozycja+1]]-48 else
numer_IRQ:=7 end;
Bywa, �e chcieliby�my, aby u�ytkownik programu nie mia� dost�pu do u�ywanych przez program plik�w VOC (tzn. nie m�g� przez np. prost� podmian� zmieni� efekt�w d�wi�kowych w naszej grze). Najprostszym sposobem wydaje si� wtedy zmiana ich nazwy i, cz�ciowo, struktury [np. obci�cie nag��wka i pozostawienie tylko bloku danych) lub np. �sklejenie" ich w jeden plik i przechowywanie przez program po�o�enia poszczeg�lnych �sk�adowych". W przypadku niewielu plik�w za spos�b mo�na tak�e uzna� po��czenie ich zawarto�ci z kodem naszego programu. Poni�ej prezentuj� przyk�adowy listing. Program odtwarza w��czone na etapie konsolidacji dane d�wi�kowe zapisane w formacie VOC. Korzysta tak�e ze skonsolidowanego ze swoim kodem sterownika. Podobny programik mo�e na przyk�ad znale�� zastosowanie przy tworzeniu plik�w wsadowych (podczas dzia�ania kt�rych komunikaty b�d� np. wypowiadane za po�rednictwem SB).
program p1;
usesVOCDrv;
{tekst biblioteki zamieszczony przy opisie sposobu
obs�ug/� PLIK�W VOC
korzystane ze sterownika CT-WICE}
{$Lexample1,obj} procedur� D�wi�k:
external:
kod procedury D�wi�k to zawarto�� pliku example1.obj utworzonego w nast�puj�cy spos�b:
BINDBJ example1.voc example1,obj D�wi�k
}
var
Status ;word:
segm, przesu�, wynik:ward;
procedur� Odtworz_zaw_pliku(si0iword];
begin
o:=o+$1A:
{ d�ugo�� nag��wka dla tej wersji formatu }
asm
mov bx,6
mov es,s
mov di,o
cali far ptrvoice end;
nepeat unti Status =0 {czekamy na koniec} end;
begin
Status =0;
WriteInCBum bum bum,..'3; {informacja } asm
movbx,3
cali far ptrvcice
nnov wynik,ax end;
ifwynikoOthen
begin wnteInfB��d podczas inicjalizacji sterownika.');
halt end;
segm:=segEStatusl;
przesu�; =ofs[Status], asm
mov bx,5
mov es,segm
mov di, przesu�
ROZDZIA� 2
end.
OdCworz_zcWJ^Ikutseg[D2wiek),of5EDzwiek]);
as m
movbx,9
cali far ptrvai[:e end end. {iju�}
2.3 OBS�UGA WI�KSZYCH PLIK�W
Praca z plikami formatu VOC przy u�yciu standardowego sterownika CT-VOICE jest wygodna, ale nie pozbawiona wad. Za podstawow� nale�y uzna� fakt, �e niemo�liwe jest odtworzenie pliku o rozmiarach przekraczaj�cych wielko�� dost�pnego do zaallokowa-nia obszaru RAM. Poza tym konieczno�� �adowania pliku do pami�ci przed odtworzeniem zmusza nas do walki o niemal ka�dy bajt. K�opotliwy Jest te� zapis d�wi�ku o nieco wi�kszej d�ugo�ci. Okazuje si�, �e w�r�d rozpowszechnianych wraz z kart� plik�w znajduje si� CTVDSK.DRV, zawieraj�cy kod sterownika (Creative Disk Double-Buffering Voice Driver), przy u�yciu kt�rego mo�emy odgrywa� pliki bezpo�rednio z dysku i zapisywa� prosto do pliku (!). Pomys� jest prosty - sterownik wykorzystuje zdefiniowany wcze�niej bufor dziel�c go na dwie cz�ci, do jednej �doczytuj�c" kolejne partie pliku, z drugiej za� odtwarzaj�c uprzednio �doczytane". Funkcje nowego sterownika niewiele r�ni� si� od funkcji standardowego CT-VOICE. Oto opis kilku z nich, niezb�dnych do zapisu i odtwarzania danych d�wi�kowych wprost z dysku, a nie udost�pnianych (lub wymagaj�cych odmiennych parametr�w) przez kod zawarty w CT-VOI-CE.DRV:
Funkcja 3: Inicjalizacja sterownika
Wej�cie: BX=3
AX= rozmiar bufora Wyj�cie: AX -