10.07.2015 Views

2× DVD - Vitajte na stránkach www.einsty.hostujem.sk

2× DVD - Vitajte na stránkach www.einsty.hostujem.sk

2× DVD - Vitajte na stránkach www.einsty.hostujem.sk

SHOW MORE
SHOW LESS
  • No tags were found...

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

P R O G R A M U J E M Epotom zvýši o jednotku a vzápätí je volaná funkcia GetMem, ktorá alokuje potrebnúpamä. Nasleduje volanie metódy GetInfo1, ktorá tentoraz u urobí to, èo robi má – zistíúdaje o súbore MP3 a vráti hodnotu, ktorá <strong>na</strong> ne ukazuje (adresa údajov je uloená vpremennej TechInfo). Tieto informácie sú však iba takpovediac v surovom formáte, pretoich treba dekódova. Na to nám slúi funkcia DecodeMPEGInfo1, deklarovaná v jednot−ke MPEGDefs. Mono vás prekvapil zápisMPEGDefs.DecodeMPEGInfo1(TechInfo,Layer,Bitrate,Frequency,StereoMode);Tento výraz sa odvoláva <strong>na</strong> jednotku MPEGDefs (v hre teda nie je nijaký objekt, akoby sa <strong>na</strong> prvý poh¾ad mohlo zda). Takýto postup síce nie je èastý, je však dobré vedie,o èo ide. S funkciami èi procedúrami jednotky je moné pracova tak, ako keby to bolimetódy nejakého objektu. Môeme preto poui zápis typu NázovJednoky.NázovFunk−cie. V tomto prípade však takýto zápis vôbec nie je potrebný, úplne staèí, keï jedno−ducho <strong>na</strong>píšemeInitStream;Play;Timer.E<strong>na</strong>bled:=true;Pauza.E<strong>na</strong>bled:=true;Okrem toho je potrebné upravi kód, ktorý sa vykoná po stlaèení tlaèidla Stop, vtedyje toti potrebné èasovaè zastavi:procedure TPlayerWnd.StopClick(Sender: TObject);beginif Player.PlayerMode=pmPlaying then Player.Stop;Pauza.E<strong>na</strong>bled:=false;Timer.E<strong>na</strong>bled:=false;end;DecodeMPEGInfo1(TechInfo,Layer,Bitrate,Frequency,StereoMode);Po dekódovaní informácií sa tie zobrazia v komponente TLabel <strong>na</strong>zvanom Tech.Nepochybujem, e vás pri <strong>sk</strong>úmaní procedúry PlayMP3 zarazil tento zvláštny výraz:StereoModes[StereoMode]Dátový typ StereoMode je v jednotke ElSounds deklarovaný takto:TElSStereoMode = (MPG_MD_STEREO, MPG_MD_JOINT_STEREO, MPG_MD_DUAL_CHANNEL,MPG_MD_MONO);Konštanta StereoModes je definovaná tak, e kadý reazec vlastne zodpovedá jednejz týchto hodnôt, vïaka èomu sme nemuseli poui príkaz Case.Po zí<strong>sk</strong>aní technických informácií o súbore MP3 <strong>na</strong>sleduje volanie funkcie GetInfo2,ktorá vráti ukazovate¾ (pointer) <strong>na</strong> dátovú štruktúru, ktorá opisuje <strong>sk</strong>ladbu. Podobneako v predchádzajúcom prípade aj teraz je potrebné dáta dekódova, tentoraz pomo−cou funkcie DecodeMPEGInfo2. Po tomto úkone u máme k dispozícii údaje ako názov<strong>sk</strong>ladby, meno interpreta, rok atï., ktoré môeme zobrazi pomocou komponentuNazov.Kadý slušný prehrávaè by mal zobrazova dåku <strong>sk</strong>ladby a aj aktuálnu pozíciu v nej.Na hlavný formulár preto pridáme dva komponenty TLabel, prièom prvý <strong>na</strong>zvemeCelkovyCas a druhý Pozicia. Prvý údaj bude k dispozícii hneï po štarte <strong>sk</strong>ladby, ten druhýbude potrebné pravidelne obnovova. Informácie o dåke <strong>sk</strong>ladby a aktuálnej pozícii jemoné zisti prostredníctvom vlastností Size a Position, prièom obe hodnoty sú uvedenév milisekundách. Aby sme po spustení <strong>sk</strong>ladby mohli vidie jej celkovú dåku, musímeupravi metódu PlayMP3. Keïe budeme potrebova nejaké drobné prepoèty, musíme<strong>na</strong>j<strong>sk</strong>ôr deklarova dve nové premenné:Minuty,Sekundy:byte;Potom upravíme koniec metódy, ktorý bude vyzera takto:Nazov.Caption:=Artist + - + Title;minuty:=(Player.Size div 1000) div 60;sekundy:=(Player.Size div 1000) mod 60;CelkovyCas.Caption:=Format( %.2d: %.2d ,[minuty,sekundy]);Zobrazenie celkového èasu u funguje, ostáva u len dorobi priebený indikátor pozí−cie v <strong>sk</strong>ladbe. Ten bude pracova tak, e sa v jednosekundovom intervale bude vola ruti−<strong>na</strong>, ktorá pomocou vlastnosti Position zistí, ko¾ko minút a sekúnd sa zo <strong>sk</strong>ladby prehralo.Iste ste vytušili, e <strong>na</strong> to budeme potrebova komponent TTimer. Keïe ruti<strong>na</strong> bude vola−ná kadú sekundu, ponecháme vlastnos Interval <strong>na</strong>stavenú <strong>na</strong> hodnote 1000. VlastnosE<strong>na</strong>bled <strong>na</strong>stavíme <strong>na</strong> false, pretoe èasovaè bude spustený a po zaèatí prehrávania.V podstate bude táto procedúra totoná s procedúrou <strong>na</strong> zistenie celkovej ve¾kosti <strong>sk</strong>lad−by. Jediný rozdiel tkvie v tom, e kým v predchádzajúcom prípade sme pouili vlastnosSize, teraz pouijeme vlastnos Position:procedure TPlayerWnd.TimerTimer(Sender: TObject);varminuty,sekundy:byte;beginminuty:=(Player.Position div 1000) div 60;sekundy:=(Player.Position div 1000) mod 60;Pozicia.Caption:=Format( %.2d: %.2d ,[minuty,sekundy]);end;Samozrejme, nesmieme zabudnú modifikova metódu PlayMP3, pretoe práve v nejbude èasovaè spustený:Obr. 1Väèši<strong>na</strong> kvalitných MP3 prehrávaèov obsahuje aj Seeking bar, preto ho pridáme ajdo nášho programu. Ako som u spomenul, nie je vhodné <strong>na</strong> tento úèel poui kom−ponent TTrackBar, preto pouijeme komponent TSlider, ktorý sa dodáva s MP3 kom−ponentom. Ten bude pracova podobne ako Seeking bar vo WinAmpe: bude priebeneukazova pozíciu v <strong>sk</strong>ladbe a zároveò sa pomocou neho budeme môc v <strong>sk</strong>ladbe pre−súva. Pri <strong>na</strong>stavovaní polohy jazdca opä vyuijeme komponent TTimer, pretoe tátooperácia sa bude dia súbene so zobrazovaním pozície v <strong>sk</strong>ladbe:procedure TPlayerWnd.TimerTimer(Sender: TObject);varminuty,sekundy:byte;beginminuty:=(Player.Position div 1000) div 60;sekundy:=(Player.Position div 1000) mod 60;Pozicia.Caption:=Format( %.2d: %.2d ,[minuty,sekundy]);Slider.Value:=Round(Player.Position / Player.Size *100);end;Na rade je <strong>na</strong>písanie rutiny, ktorá nám umoní presúva sa v <strong>sk</strong>ladbe. Keï vyz<strong>na</strong>èíme kom−ponent TSlider a vyberieme kartu Events, bude nás láka tento kód umiestni do obslunej ruti−ny udalosti OnChange. To však nie je správne riešenie, pretoe potom by sa táto procedúravyvolala pri akomko¾vek pohybe jazdcom. Ak by sme ho teda uchopili, premiestnili <strong>na</strong> jedenkoniec komponentu, vzápätí <strong>na</strong> druhý koniec a potom pustili myš, zistili by sme, e dekodéru pravdepodobne „zošalel“, keïe udalos OnChange bola vyvolaná pri kadom pohybejazdcom. Našastie však existuje udalos, ktorá vyvolá obslunú rutinu iba vtedy, keï smetlaèidlo myši pustili a poloha jazdca sa ustálila. Táto udalos sa volá OnStopTracking (v kom−ponente TTrackBar neexistuje) a jej obsluha bude spúša <strong>na</strong>sledujúci kód:procedure TPlayerWnd.SliderStopTracking(Sender: TObject);beginif Player.PlayerModepmPlaying then exit;Player.Position:=Round(Slider.Value / 100 * Player.Size);end;Ak teraz jazdca uchopíme a premiestnime, bude to ma rov<strong>na</strong>ký efekt ako pouitieSeeking baru vo WinAmpe. Samozrejme, premiestnenie je moné iba vtedy, ak sa práveprehráva nejaká <strong>sk</strong>ladba, v opaènom prípade sa nestane niè.1/2002 PC REVUE 109

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!