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 -