<p id='prepend'>V p°edchozφm Φlßnku jste se seznßmili s Φßstφ Mobile Multimedia API (MMAPI) t²kajφcφ se zvuku, tentokrßt budeme pokraΦovat p°ehledem prßce se zvukem u API firmy Nokia.</p>
<h3>Nokia UI API</h3>
<p>API obsahujφcφ obsluhu zvuku se jmenuje Nokia UI API. Toto API by m∞ly um∞t vÜechny telefony znaΦky Nokia. N∞kterΘ u₧ ovÜem obsahujφ navic i MMAPI, kter²m jsem se zab²vala v p°edchozφm Φlßnku. MMAPI mß vφce mo₧nostφ ne₧ Nokia UI API, ale kterΘ API zvolit zßle₧φ takΘ na tom, na kter²ch vÜech telefonech mß aplikace fungovat.</p>
<p>Pou₧itφ t°φdy <code>Sound</code> z balφku <code>com.nokia.mid.sound</code> je celkem jednoduchΘ. Tato t°φda umo₧≥uje zahrßt t≤n danΘ frekvence a dΘlky, nebo p°ehrßt melodii ve formßtu WAV nebo RTPL (ringing tone programming language), co₧ je formßt vyzvßn∞nφ. Proto₧e ne ka₧d² telefon umφ p°ehrßt WAV a navφc je zvukov² soubor ve formßtu WAV obvykle hodn∞ velk², je lepÜφ pou₧φvat formßt RTPL, i kdy₧ umo₧≥uje hranφ pouze jednohlasΘ melodie. JakΘ formßty telefon umφ p°ehrßt, zjistφte metodou <code>Sound.getSupportedFormats</code>.</p>
<br /> <span class='comment'>// podporuje formßt WAV</span>
<br /> } else if (types[i]==Sound.FORMAT_TONE){
<br /> <span class='comment'>// podporuje formßt RTPL</span>
<br /> }
<br />}
</div>
<p>Trochu nepraktickΘ je, ₧e jen n∞kterΘ emulßtory p°ehrßvajφ zvuk a obΦas i kdy₧ jej p°ehrßvajφ, je v²sledek odliÜn² od toho, co je poslΘze slyÜet z telefonu. Proto se p°i testovßnφ zvuku nespolΘhejte pouze na v²sledek dosa₧en² v emulßtoru.</p>
<h3>P°ehrßnφ jednoho t≤nu</h3>
<p>Telefony se mohou liÜit tφm, jakΘ t≤ny jsou schopny zahrßt. N∞kterΘ telefony mohou zvlßdat pouze frekvence odpovφdajφcφ konkrΘtnφm t≤n∙m ze stupnice a p°i pokusu nastavit jinou frekvenci vyhodφ <code>IllegalArgumentException</code>. <a href='podklady/bittnerova/866/tony.html'>T≤ny a jejich frekvence</a> najdete v p°ipojenΘm p°ehledu.</p>
<p>Pokud chcete zahrßt t≤n delÜφ ne₧ dv∞ vte°iny, m∙₧e se telefon rozhodnout vßm nevyhov∞t, a to tak, ₧e nezahraje po₧adovan² t≤n, ale ani nevyhodφ ₧ßdnou v²jimku.</p>
<div class='sample'>
<span class='comment'>// Vytvo°enφ instance t°φdy Sound s danou
<br />// frekvencφ t≤nu v Hz a dΘlkou t≤nu v milisekundßch.
<br />// Tohle je konkrΘtn∞ 2 vte°iny trvajφcφ komornφ A</span>
<br /><span class='comment'>// Nastavenφ dalÜφho t≤nu k p°ehrßnφ</span>
<br />sound.init(880, 1000);
</div>
<h3>P°ehrßnφ melodie</h3>
<h4>FORMAT_TONE</h4>
<p>Pro p°ehrßnφ melodie pot°ebujeme zvukovß data p°edat t°φd∞ <code>Sound</code> jako pole bajt∙. P°i pou₧itφ formßtu <code>Sound.FORMAT_TONE</code> je nejjednoduÜÜφ mφt toto pole bajt∙ p°φmo v n∞jakΘ t°φd∞. Dßvat zvukovß data do zvlßÜtnφch soubor∙ se m∙₧e vyplatit, je-li pot°eba zvuk vym∞nit bez kompilace aplikace.</p>
<div class='sample'>
<span class='comment'>// Pole bajt∙ s melodiφ v RTPL</span>
<p>Definice syntaxe RTPL je snad jeÜt∞ mΘn∞ p°ehlednß ne₧ definice syntaxe sekvence t≤n∙ pro MMAPI z p°edchozφho Φlßnku. Lze ji nalΘzt ve specifikaci <a href='http://home.yole.ru/files/sms3_0_0.pdf'>Smart Messaging Specification</a>. NaÜt∞stφ nenφ pot°eba se syntaxφ RTPL vlastnoruΦn∞ prokousat. <a href='http://www.forum.nokia.com/main/0,6566,034-2,00.html'>Nokia Developer's Suite 2.0 for J2ME</a> obsahuje konvertor pro p°evod zvuku na pole bajt∙ ve sprßvnΘm formßtu.</p>
<li><strong>RTXML</strong> - XML formßt vyzvßn∞nφ (ringing tone)</li>
</ul>
</li>
<li>V²stupnφ formßty:
<ul>
<li><strong>OTA</strong> - v²stup pro OTA stahovßnφ vyzvßn∞nφ</li>
<li><strong>pole bajt∙</strong> - formßt pro vlo₧enφ do JavovΘho k≤du (tento formßt vßs bude asi nejvφc zajφmat)</li>
<li><strong>RTXML</strong> - XML formßt vyzvßn∞nφ (ringing tone), tento formßt se m∙₧e hodit, mßte-li melodii v MIDI formßtu a chcete-li ji jeÜt∞ upravit</li>
</ul>
</li>
</ul>
</div>
<p>Formßt RTXML je velmi jednoduch² a hodφ se na psanφ vlastnφch melodiφ, pokud umφte noty. Bohu₧el jsem k tomuto formßtu nenaÜla ₧ßdnΘ dtd, tak₧e pokud budete chtφt napsat n∞jakou komplikovan∞jÜφ melodii a nebudete v hledßnφ specifikace RTXML ·sp∞Ün∞jÜφ, nezbyde vßm, ne₧ pou₧φt n∞jak² jin² editor melodie a pak se zp∞tn∞ podφvat, jak se to dalo napsat p°φmo v RTXML.</p>
<br /> <span class='comment'><!-- loop-value je poΦet opakovßnφ melodie --></span>
<br /> <pattern id="A" loop-value="0">
<br /> <span class='comment'><!-- tempo melodie --></span>
<br /> <tempo value="100"/>
<br /> <span class='comment'><!-- definuje v²Üku not, kterΘ za tφmto elementem nßsledujφ,
<br /> nap°. je-li hodnota 1, pak nßsledujφcφ noty
<br /> le₧φ v prvnφ oktßv∞ ap. --></span>
<br /> <scale value="1"/>
<br /> <span class='comment'><!-- Φtvr¥ovß nota G1 --></span>
<br /> <note value="G" duration="1/4"/>
<br /> <span class='comment'><!-- Φtvr¥ovß nota H1 (v anglicky mluvφcφch
<br /> zemφch naz²vajφ notu H pφsmenem B) --></span>
<br /> <note value="B" duration="1/4"/>
<br /> <span class='comment'><!-- nßsledujφcφ noty jsou z druhΘ oktßvy --></span>
<br /> <scale value="2"/>
<br /> <span class='comment'><!-- p∙lovß nota D2 --></span>
<br /> <note value="D" duration="1/2"/>
<br /> </pattern>
<br /></ringing-tone>
</div>
<p>DΘlky not mohou b²t pouze zlomky mocnin dvojky, nejv∞tÜφ mo₧nß dΘlka je 1. K not∞ lze p°idat atribut <code>specifier="."</code>, kter² notu prodlu₧uje o polovinu jejφ dΘlky.</p>
<h4>FORMAT_WAV</h4>
<p>Pro p°ehrßvßnφ zvuku ve formßtu WAV je nejsnadn∞jÜφ mφt tento zvuk v samostatnΘm souboru. Formßt WAV je elektronickou verzφ libovolnΘho audio zßznamu, tak₧e s nφm jde vytvo°it komplexn∞jÜφ zvuky ne₧ pomocφ t≤novΘho formßtu. Jak jsem vÜak uvedla d°φve, jsou zvukovΘ soubory v tomto formßtu obvykle p°φliÜ velkΘ, tak₧e v mobilnφch aplikacφch jej lze pou₧φt pouze pro kratiΦkΘ zvukovΘ vzorky.</p>
<div class='sample'>
try{
<br /> <span class='comment'>// otev°enφ vstupnφho proudu ze souboru 1.wav,
<br /> // kter² je umφst∞n v ko°enφ JAR souboru</span>
<br /> <span class='comment'>// naΦtenφ maximßln∞ 500 bajt∙ ze vstupnφho proudu
<br /> // do pole b</span>
<br /> int i = is.read(b);
<br /> <span class='comment'>// je-li i==500, je mo₧nΘ, ₧e zvukov² soubor nebyl naΦten² cel²
<br /> // a Φtenφ je pot°eba opakovat v n∞jakΘm cyklu ...</span>
<br /> Sound sound = new Sound(b, Sound.FORMAT_WAV);
<br /> sound.play(1);
<br />} catch (Exception e){
<br /> e.printStackTrace();
<br />}
</div>
<h3>DalÜφ mo₧nosti NokiaUI API</h3>
<h4>Nastavenφ hlasitosti</h4>
<p>Hlasitost zvuku se nastavuje metodou <code>setGain(int hlasitost)</code>. Parametr "hlasitost" je Φφslo od 0 do 255, p°iΦem₧ 0 znamenß ticho a 255 nejv∞tÜφ mo₧nou hlasitost, kterou za°φzenφ dokß₧e dosßhnout.</p>
<p>Metoda <code>getGain()</code> vracφ aktußlnφ nastavenou hlasitost. Pokud jeÜt∞ nebyla volßna metoda <code>setGain(int hlasitost)</code>, m∙₧e se stßt, ₧e implementace Javy nenφ schopna zjistit aktußlnφ hlasitost. V tom p°φpad∞ vrßtφ volßnφ metody <code>getGain()</code> hodnotu -1.</p>
<h4>Zßrove≥ hranΘ zvuky</h4>
<p>N∞kdy se v aplikaci m∙₧e hodit p°ehrßvat vφce zvuk∙ zßrove≥, nap°φklad u hry b∞₧φ na pozadφ stßle dokola jedna melodie, do kterΘ obΦas zaznφ specißlnφ zvukov² efekt. Kolik zvuk∙ konkrΘtnφ telefon umφ p°ehrßt, lze zjistit volßnφm metody <code>static int getConcurrentSoundCount(int typMedia)</code>. Pokud telefon neumφ zßrove≥ p°ehrßvat vφce ne₧ jednu melodii, je nejjist∞jÜφ p°ed p°ehrßnφm specißlnφho efektu zastavit melodii na pozadφ metodou <code>stop()</code>, p°ehrßt specißlnφ efekt a po jeho skonΦenφ (zjistφ se pomocφ zaregistrovanΘho posluchaΦe) op∞t pokraΦovat v p°ehrßvßnφ melodie na pozadφ metodou <code>resume()</code>.</p>
<h4>PosluchaΦ zvukov²ch udßlostφ</h4>
<p>Pro prßci se zvukem se m∙₧e hodit v∞d∞t, v jakΘm stavu se jakß zvukovß ukßzka nachßzφ. Pokud nap°φklad chceme v aplikaci na pozadφ neustßle pouÜt∞t dokola jednu zvukovou ukßzku, zaregistrujeme si na ni posluchaΦe a p°i skonΦenφ jejφho p°ehrßvßnφ ji spustφme znovu. PosluchaΦe si vytvo°φme implementacφ rozhranφ <code>SoundListener</code> a zaregistrujeme metodou <code>setSoundListener(SoundListener posluchac)</code>. Jeden zvuk m∙₧e mφt nastavenΘho pouze jednoho posluchaΦe, co₧ ovÜem niΦemu nevadφ. Naopak jeden posluchaΦ m∙₧e d∞lat posluchaΦe vÜem zvuk∙m, kterΘ v aplikaci pou₧φvßme.</p>
<div class='sample'>
public class MySoundListener implements SoundListener{
<br /><span class='comment'> /*
<br /> sound - instance t°φdy Sound, kde nastala udßlost
<br /> event - udßlost, kterß nastala
<br /> */
<br /></span>
public void soundStateChanged(Sound sound, int event) {
<br /> <span class='comment'>// zde se provede obsluha udßlosti</span>
<br /> }
<br />}
</div>
<p>Udßlosti, kterΘ mohou nastat, definuje t°φda <code>Sound</code> jako konstanty:</p>
<li><code>SOUND_STOPPED</code> - p°ehrßvßnφ zvukovΘ ukßzky je zastaveno, v tomto stavu se zvuk nachßzφ po jeho vytvo°enφ, dokud jeÜt∞ nebyl spuÜt∞n</li>
<li><code>SOUND_UNINITIALIZED</code> - zvukovß ukßzka se nep°ehrßvß a navφc u₧ byly uvoln∞ny vÜechny pot°ebnΘ zdroje volßnφm metody <code>release()</code></li>
</ul>
</div>
<p>Pokud u₧ zvuk nebude dßle pou₧φvßn, m∞ly by se alokovanΘ zdroje uvolnit volßnφm metody <code>release()</code></p>
<h3>Odkazy, zdroje</h3>
<div class='list'>
<ul>
<li><a href='http://java.sun.com/products/j2mewtoolkit/'>J2ME Wireless Toolkit 2.1</a> - MIDP 2.0 emulßtor od firmy Sun</li>
<li><a href='http://forum.nokia.com'>Forum Nokia</a> - informace o telefonech znaΦky Nokia, emulßtory jednotliv²ch telefon∙ a prost°edφ Nokia Developer's Suite</li>
<li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3411'>Metadata a hlaviΦka pro XHTML dokument</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3400'>╚esk² programovacφ jazyk Flex a modFlex</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3386'>╚eskß sprßva socißlnφho zabezpeΦenφ on-line</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3412'>WebML - operace a manipulace s daty</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=1444'>Statistika p°φstup∙ v PHP - kalendß°</a></li>
</ul>
</div>
</div>
<div class='page-right-box cauldron'>
<h3>Diskuznφ kotel</h3>
<div class='page-right-box-in'>
<ul>
<li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3400' title='(32 komentß°∙)'>╚esk² programovacφ jazyk Flex a modFlex</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3411' title='(25 komentß°∙)'>Metadata a hlaviΦka pro XHTML dokument</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3412' title='(10 komentß°∙)'>WebML - operace a manipulace s daty</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3418' title='(5 komentß°∙)'>Sprßva barev - Color Management System (CMS)</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3415' title='(4 komentß°∙)'>Sprßvce soubor∙ pomocφ DataGridu v ASP.NET - upload soubor∙</a></li>