int21h

Multimédia pomocí LX5 Suite (+BASS)

Vítejte do druhého dílu. Od minule se toho trochu změnilo. Snažil jsem se aktualizovat jednotky, o kterých píši, abych byl v obraze a zjistil jsem, že jsem měl celou dobu dost aktuální verze (kromě výjimek), takže se toho moc zase nevyvíjelo. V dnešním díle nás tedy čeká LX5SUITE.

Nejprve bych doporučil dalších pár jednotek. K LX5SUITE, který dnes probereme, se dodává BASS20FPC, což je zvuková jednotka, která obsahuje API pro Pascal, VB a C. Myslím si, že je na ní LX5SUITE celkem závislý. Stáhnout si ji můžete tam, kde jeho, tedy:

http://www.paradicesoftware.com/

Její ovládání je celkem složitější. Snad naproti tomu má LX5SUITE, jakožto její "nadstavba", něco lepšího. Pokud Vám jde jen o ten zvuk, stále doporučuji FMOD z minula. Nová verze je totiž už i pro Linux a navíc je zde nové rozhraní pro Delphi (takže snad i pro FP; dokumentace ale bohužel jen pro C verzi). O ní ale budu psát až příště. Je tam navíc jen málo příkladů (ty jsou jen pro C, a většina z nich nemá EXE).

Minule jsem uváděl adresu pro JediSDL, ale tam snad byly jen hlavičky. To, co jsem měl skutečně na mysli se dá stáhnout na http://www.libsdl.org. Už jsem pochopil, proč tu kdysi bylo JediSDL probíráno v C. Pro FP je určitě starší verze (SDL4Freepascal-1.2.0.0) a nevím, jestli se dá ještě někde dobře sehnat. Jsou tu sice (pro mne) srozumitelné příklady, ale to, co se o této jednotce (SDL) v INT21h již napsalo, je zdá se, dostačující na téměř všechny základní oblasti. Jak jsem následně zjistil, tak se dají stáhnout i hlavičky k Free Pascalu (a dalším), a přitom se jedná o 2 roky novější verzi, než co jsem měl doposud. Jestli o ní budu někdy psát, tak později. Stáhnout si ji můžete z:

http://sourceforge.net/projects/jedi-sdl/

Pravděpodobně se tomu budu také někdy věnovat, protože to obsahuje nejen odkaz na jednotku FMOD (přes Pascal), ale také balíčky pro grafiku, obrázky, OpenGL, Mixer pro zvuky, jednotku pro Internet, zvuky, TTF a mono fonty, filtry, čtení myši a joysticku, ovládání CD-ROM mechaniky, hotový 2D engine, přehrávač MPEG filmů a další. Kromě toho je tu přes 1 MB velká HTML a také Windows dokumentace, kde je vše dobře popsáno, navíc úplně dole v indexu jsou "tutorialy".

Těm, které zaujala v minulém díle jednotka VGFX, tak vězte, že autor stvořil i VGFX_3D, která zajiš?uje jednoduchou 3D grafiku. Nemá cenu se však učit 20 věcí současně, takže my se dneska už podíváme "komplexně" jen na LX5SUITE (zdá se mi rychlejší než VFGX, a i když může být trochu složitější, korektně obsluhuje ALT+TAB (sice zachovává rozlišení, ale má problémy s obnovením, protože v příkladech se ignoruje maximalizace) a není to jen o grafice). Zase je ale škoda, že poslední verze této jednotky je z 2004/08/07 (0.76). Pravda, už se asi trochu vzdaluji od našeho "poslání" podporovat DOS (i když ne úplně), ale slibuji, že to nebude na dlouho.

Takže jdeme na LX5SUITE. K tomuto balíku se dodává 0.5 MB velká HTML nápověda (bez obrázků), která je zpracována velmi přehledně, navíc obsahuje spoustu FAQ. Dodávána je spousta příkladů (včetně EXE souboru). Balík obsahuje jednotky pro práci s průhledností, poli, zvuky, barvami, procesorem, CRT režimy, diskovými jednotkami, soubory, fonty, grafikou, GUI typu Windows, obrázky, klávesnicí, myší, pamětí, matematickými operacemi, OS, sprity, řetězci, texty, časovačem, webem a WIN32 API. ?koda jen, že se nedá rozumě používat všechno najednou (měli byste se zaměřit jen na jedno a to zdokonalovat), tím myslím hlavně např. SDL, VGFX, atd. Protože ale LX5SUITE rádo využívá jednotku BASS, která umí fakt skvělé efekty, probereme si ji také v dnešním seriálu (pak není důvod používat BASS samostatně, ale s využitím LX5SUITE, které zajistí grafiku a všechno ostatní). Je také nutné pod WIN32 využívat DirectX, k čemuž budete potřebovat potřebné PP soubory z balíku, který jsme probírali (spíše trochu nakousli) minule. A překvapení na závěr: LX5SUITE dokáže fungovat i pod DOSem! Samozřejmě, není podmínkou, že, když použijete LX5SUITE na grafiku, tak už nemůžete použít např. FMOD na zvuky. Stačí jednoduše nepoužívat zvukový engine z LX5SUITE. Sami si jistě uděláte obrázek o tom, které části bude lepší používat z kterého balíku.

Pro využití jednotky BASS potřebujete mít u svého programu (nebo v adresáři WINDOWS, popř. WINDOWS/SYSTEM) knihovnu BASS.DLL. Pro využití jednotky ve Free Pascalu pak stačí přikompilovat soubor BASSFPC.PAS (44 kB). Když si pročtete dokumentaci (která je sice pro C, ale velmi, velmi přehledná a jasná), tak zjistíte, že:

Když si rozebereme krátký příklad, jistě pochopíte alespoň základy přehrávání zvuků (jednotka běží i v programech, které jedou v textových režimech - samozřejmě je ale i tak nutné je kompilovat pro Windows):

uses Windows,BassFPC,Crt;
var p : PChar;
    Stream : HStream;
const Hudba = 'Hudba.mp3';
begin
 {vybereme číslo proudu}
 stream := 0;
 {ověříme, zda je jednotka nahrána}
 if BASS_GetVersion <> MAKELONG(2,0) then Halt(2);
 {spustíme audio systém v kvalitě 44 kHz 16 bitů stereo}
 if not BASS_Init(1,44100,0,0,nil) then Halt(3);
 {nahrajeme hudební soubor tak, že z něj vytvoříme proud}
 {tedy se soubor bude hrát z disku po částech}
 p := PChar(Hudba);
 Stream := BASS_StreamCreateFile(False,p,0,0,0);
 if Stream = 0 then Halt(4);
 {začneme ho přehrávat}
 if not BASS_StreamPlay(Stream,False,0) then Halt(5);
 {opakujeme ve smyčce, dáváme čas ostatním vláknům}
 repeat
  Sleep(100);
 until keypressed;
 {zastavíme přehrávání kanálu}
 BASS_ChannelStop(stream);
 {uvolníme proud z paměti}
 if Stream <> 0 then BASS_StreamFree(Stream);
 {ukončíme zvukový systém}
 BASS_Free;
end.  

Ano, jsou to prosté základy, ale když si to pak porovnáte s dokumentací, naučíte se i ten zbytek. Ona jednotka BASS není nic "extra" (to přeháním), ale umí kromě jiných věcí třeba i internetová rádia, DSP efekty, frekvenční spektrum, MIDI, EAX prostředí, Doplerův efekt, a mnohé další. Příklady na to jsou hlavně u C zdrojáků. Pro začátek by to myslím ale stačilo, takže se budeme moci vrhnout na ten hlavní balík. Ten je pojat více méně jako OOP, takže se to většinou neřídí stylem, že nějaké funkci předáváte data ke zpracování, ale že u příslušných dat je už jejich příslušná funkce:

Audio systém:

Video systém:

Fonty:

GUI jednotka:

Obrázky:

Klávesnice:

Myš:

Internet:

Ostatní:

Toto je jen stručný výtah funkcí z dokumentace. Je jich tam samozřejmě mnohem více, ale tyto mi přišly nejzajímavější, a také Vám alespoň stručně pomohou najít ty ostatní. Nyní se podíváme na některé příklady, které jsou k balíku dodávány, abyste také viděli v chodu některé procedury (poznámka: je samozřejmě nutné, pokud se např. podaří inicializovat audio systém a teprve pak dojde k chybě, díky které budete chtít udělat Halt (čehož byste se měli vyvarovat), bude nutné jej ještě před tím ukončit!):

{pod Windows potřebujeme nastartovat grafiku přes Direct X}
{$ifdef win32} {$apptype gui} {$endif}
{$include lxglobal.inc}


{výpočet jednotek, z nichž některé/většinu budete potřebovat na různé úkoly}
uses lx5suite, lx5error, lx5graph, lx5image, lx5keybd, lx5mouse, lx5os, lx5sprte, lx5web
     lx5win32, lx5color, lx5gui, lx5fonts, lx5files, lx5timer, lx5crt, lx5audio, lx5mem;


{některé potřebné proměnné}
var	mysound : tsound;
	sprite : tsprite;
	image : timage;
	memory : tmemory;
	font : tfont;
	y : lxinteger;	{zajistí, že to bude 16 bitový INTEGER na všech platformách}
const Napis = 'Pokusný text';


{*** využití AUDIO systému ***}
{a také klávesnice}


{inicializace}
 if audio_open <> LX_OK then Halt(2);
{nahrajeme zvuk jako proud}
 if LoadSound_Stream('Soubor',mysound) <> LX_OK then Halt(1);
{začneme přehrávat}
 mysound.play;
{nastavíme hlasitost}
 mysound.volume := 128;
{přehráváme zvuk do stisku nějaké klávesy}
 repeat
  lx5suite_process;
 until keywaiting;
{vyjmeme klávesu, smažeme zvuk a ukončíme audio systém}
 keyread;
 mysound.free;
 audio_close;


{*** využití VIDEO systému ***}
{a s ním i myši}


{inicializace grafiky v 640x480 a 16 bitovém HC}
 video_open(640,480,16,VIDEO_HALT_ON_ERROR or VIDEO_MOUSE or VIDEO_BUFFER_SMART);
{ruční kreslení čáry z 0,100 do 639,100 v barvě s náhodnou složkou B}
 video.hline(0,100,video.width-1,video.rgb(64,32,random(128)+64));
{nahrajeme font ve velikosti 48 bodů - to se dá později změnit}
 LoadFont_TTF('Soubor.ttf',48,48,font);
{nahrajeme obrázek}
 LoadImage('Soubor',image);
{uděláme z něj 50% průhledný sprite}
 sprite := tsprite.create_assign(image,True);
 sprite.opacity := 128;
 y := 0;
 repeat   
{vždy, když kreslíme přímo na obrazovku, musíme ji kvůli Windows zamknout!}
  video_lock;
{vymažeme na obrazovce prostor pod budoucím textem černou barvou}
  video.bar(25,67+(48*4),25+font.textwidth(napis),
            67+(48*4)+font.textheight(napis),CBlack);
{vykreslíme font pomocí nějaké textury, která navíc roluje v obou osách po 1 pixelu}
  font.write_texture(video,25,67+(48*4),Napis,image,y,y);
{odemkneme video a zvýšíme posun souřadnic}
  video_unlock;
  inc(y);
{zobrazujeme sprite dle pozice myše - vždy jako funkce příslušné k daným datům}
  sprite.move(mouse.x+25,mouse.y+25);
  sprite.show;
{aktualizujeme video}
  video_update;
{schováme sprite}
  sprite.hide;
{necháme LX5Suite zpracovat změny}
  lx5suite_process;
  if keywaiting then keyread;
{čekáme na stisk levého tlačítka myši}
 until mouse.leftbutton;
{smažeme texturu, sprite a ukončíme používání video systému}
 sprite.free;
 video_close;
 image.free;


{*** využití WEB systému ***}


const	URI_HTTP = 'http://';
	URI_WEBSITE = 'www.paradicesoftware.com/';
	URI_NEWVERSION = 'lx5suite/version.dat';


{stáhneme soubor z určité adresy do paměti}
 web_file_download(URI_HTTP+URI_WEBSITE+URI_NEWVERSION,memory);
{nebo danou stránku otevřeme rovnou v nějakém prohlížeči}
 web_open_browser(URI_HTTP+URI_WEBSITE);
{uvolníme použitou pamě?}
 lxfreeclass(memory);

Jsou to opravdu jen základy, které je potřeba rozvést (hlavně to ale ukazuje základní práci s danými objekty). Nicméně LX5SUITE nabízí, pokud umíte anglicky, příklady pracující s TTF fonty, GUI rozhraním (okna, tlačítka, zadávací oblasti), změnou velikosti spritů, Stencil bufferem (který se vytváří přes Alfa masku), průhledností či Alfa kanálem. Nemá totiž cenu, abych sem přepisoval všechny příklady do českého jazyka. Pokud anglicky neumíte, tak Bůh s vámi :-). Spíše jsem chtěl jen vzbudit zájem. Příště se podíváme na jednotku FMOD pro zvuky, a kompletní (ne tak docela) celý balík JediSDL. Opět to bude více méně stručný úvod, ale snad alespoň v něčem užitečný (pro lidi, kteří se s tím dosud vůbec nesetkali (jako já) se to myslím bude docela hodit).

Ale pokud se chcete zaměřit jen na tvorbu Windows aplikací (nebo aplikací běžících v Linuxu pod Wine), či her, které nepotřebují joystick, nemusíte už dál číst, ale můžete se zaměřit na tento balík. Je zde výborná podpora efektové grafiky, ovládání, fontů, dokonce i GUI, takže si můžete naprogramovat i vlastní okna, ale hlavně je tu podpora zvuků, a? už trochu "chudší" přímo v LX5Suite, nebo s více než dostačujícími možnostmi jednotky BASS. Jen musíte mít jednotky DirectX.. Nebo můžete psát aplikace pro DOS !!! Pokud jsem to pochopil správně, program napsaný s LX5Suite až na malé výjimky stačí zkompilovat pro DOSový Target a měl by fungovat i tam! Pokud Vám toto nestačí (mě tedy dokonale), nebo si chcete jen tak ze zájmu prohlédnout i něco dalšího, těšte se na příští díl. Pokud se Vám zdálo, že jsem toho napsal málo, můžete toho sami napsat víc...


POKRAČOVÁNÍ PŘÍŠTĚ...
2007-01-03 | Martin Lux
Reklamy:
Ronnie.cz - kulturistika, fitness, bojové sporty