┌vod
Instalace Ogg SDK
Torie k DirectSound
╚ßst 1
╚ßst 2
╚ßst 3
╚ßst 4
Funkce knihovny vorbisfile.dll
Odkazy
Ke sta₧enφ

R.Henys@seznam.cz
ICQ: 159629842

Bez Üßlku teorie to n∞kdy nejde.

Obsah:

Teorie k DirectSound

P°edem °φkm ₧e tady nenajdete kompletnφ teorii k DirectSound, ale jen n∞co mßlo co je myslφm dobrΘ v∞d∞t nejen k pochopenφ tohoto kurzu. V DirectSound p°ehrßvßme zvukovß data pomocφ zvukov²ch buffer∙ (sound buffer, rozhranφ IDirectSoundBuffer8.) ZvukovΘ buffery jsou dvojφho typu. Prvnφ z nich je primßrnφ buffer a to co v n∞m je je slyÜet v reprßΦcφch. Pokud jste se uΦili grafiku v DirectX, je to obdoba primßrnφho povrchu, kter² p°edstavoval aktußlnφ obsah obrazovky monitoru. Primßrnφ buffer je jen jeden. Ve struktu°e DSCAPS kterß odrß₧φ schopnosti vaÜeho audio za°φzenφ je sice Φlenskß prom∞nnß uchovßvajφcφ poΦet podporovan²ch primßrnφch buffer∙, ale i v dokumentaci se pφÜe ₧e tato hodnota bude v₧dy 1. Druh², jak se dß mo₧nß oΦekßvat, je sekundßrnφ buffer (obdoba offscreen povrch∙ z grafiky). T∞chto buffer∙ m∙₧ete mφt kolik jen chcete (pokud poΦφtßme i softwarovΘ). Hardwarov²ch samoz°ejm∞ b²t kolik chcete nem∙₧e. Op∞t najdeme p°φsluÜnou Φlenskou prom∞nnou, kterß udßvß maximßlnφ poΦet sekundßrnφch buffer∙ (vÜech, statick²ch i streamovan²ch) ve struktu°e DSCAPS. Dßle m∙₧eme sekundßrnφ buffery rozd∞lit na statickΘ a streamovanΘ (dynamickΘ). LiÜφ se ve zp∙sobu zßpisu dat do bufferu. Do statickΘho bufferu zapφÜete data jednou a pak ho p°ehrajete. Streamovan² buffer se p°ehrßvß po°ßd dokola dokud ho nezastavφme a data se do n∞j zapisujφ v periodick²ch intervalech. Sekundßrnφch buffer∙ m∙₧e hrßt najednou vφc ne₧ jeden. V²sledn² zvuk vznikne mixovßnφm buffer∙. Mixovßnφ se provßdφ v primßrnφm bufferu. Sekundßrnφ buffery mohou mφt toti₧ r∙znou vzorkovacφ frekvenci i jinΘ parametry a p°ed v²stupem z reprßΦku je nutno tyto parametry sjednotit. Proto data z ka₧dΘho sekundßrnφho bufferu nejd°φv putujφ do primßrnφho bufferu a zde jsou p°ehrßna. Pro tento kurz budeme pot°ebovat rozhranφ IDirectSound8, co₧ je hlavnφ rozhranφ DirectSound. Bez n∞j nic neud∞lßme. DalÜφ rozhranφ je IDirectSoundBuffer8 kterΘ p°edstavuje zvukov² buffer (statick² i dynamick²). DirectSound disponuje jeÜt∞ dalÜφmi rozhranφmi, t∞mi se ale nebudeme zab²vat, pro tento kurz nejsou d∙le₧itß. Vφce o prßci s rozhranφmi se dozvφte v jednotliv²ch kapitolßch.

Obsah

Funkce knihovny vorbisfile.dll

P°edem °φkßm, ₧e vÜechny funkce vy₧adujφ jako parametr strukturu OggVorbis_File. A tento parametr je v₧dy jako prvnφ. TakΘ nebudu popisovat vÜechny funkce kterΘ se v knihovn∞ nachßzejφ, ale jen ty nejd∙le₧it∞jÜφ a myslφm ₧e takΘ nejpou₧φvan∞jÜφ.

Struktury:


    OggVorbis_File - je zßkladnφ struktura. Obsahuje dφlΦφ struktury a prom∞nnΘ a tento celek po incialiaci obsahuje vÜechny d∙le₧itΘ informace o ogg souboru. Obahuje prom∞nnΘ a struktury nutnΘ k dek≤dovßnφ ogg souboru.

    vorbis_comment - je obsa₧ena v OggVorbis_File a obsahuje pole komentß°∙ v ogg souboru. Komentß°e jsou textovΘ °et∞zce. Na prom∞nnou udßvajφcφ poΦet kometß°∙ se takΘ pamatovalo.

    vorbis_info - je obsa₧ena v OggVorbis_File a obsahuje informace o formßtu audio dat jako je vzorkovacφ frekvence, poΦet kanßl∙, verze souboru a bitrate.

    ov_callbacks - je obsa₧ena v OggVorbis_File a obsahuje ukazatele na funkce pro prßci se soubory (Φtenφ, zßpis, posun, zφskßnφ pozice.) Je d∙le₧itß z hlediska mo₧nosti Φtenφ z jin²ch zdroj∙ ne₧ z jak²ch se dß Φφst funkcemi z knihovny stdio.h. Standartn∞ jsou ukaztele nastaveny na funkce fread, fwrite, fseek a ftell.

Inicializace, otev°enφ souboru a ·klid na konci:


    int ov_open(FILE *f,OggVorbis_File *vf,char *initial,long ibytes); - funkce otev°e ogg soubor a inicializuje strukturu OggVorbis_File, samoz°ejm∞ pokud p°i otevφrßnφ nedojde k chyb∞. Prvnφ parametr je ukazatel na otev°en² soubor, zdroj dat, nap°φklad pomocφ funkce fopen. Druh² je ukazatel na strukturu OggVorbis_File, tj. strukturu kterou funkce inicializuje. Poslednφ dva paramtry majφ v²znam v p°φpad∞ ₧e n∞jakß data u₧ byla naΦtena a zdrojov² soubor nepodporuje seeking, p°esouvßnφ se v rßmci zdroje. Pak m∙₧e b²t druh² parametr ukazatel na buffer obsahujφcφ ji₧ naΦtenß data, t°etφ parametr pak velikost bufferu v bajtech. Formßt ogg je p°izp∙soben² i pro p°enos po sφti,to jest zdroj kter² nepodporuje p°esouvßnφ se. Nep°esunete se v n∞m zp∞t ani nap°ed. V p°φpad∞ kdy by se n∞co na sφti vysφlalo v ogg formßtu, m∙₧ete jen poslouchat. S tφm jsem se ale jeÜt∞ nesetkal :( Na zdrojov² soubor se musφ v₧dy nechat odkazovat pomocφ FILE*. Pokud funkce vrßtφ nula, je to v po°ßdku. Hodnoty menÜφ ne₧ nula jsou chyby, viz dokumentace.

    int ov_open_callbacks(void *datasource, OggVorbis_File *vf, char *initial, long ibytes, ov_callbacks callbacks); - mß stejnou funkci jako ov_open, ale mß o parametr navφc a to je struktura ov_callbacks. Pou₧ijte namφsto ov_open v p°φpad∞ ₧e nelze Φφst data ze zdroje standartnφmi stdio funkcemi (fread, fwrite, fseek, ftell). Nula jako vrßcenß hodnota znaΦφ ₧e je vÜe OK, Φφslo menÜφ ne₧ nula je chyba.

    ov_clear - funkce uvolnφ zdroje alokovanΘ pro dek≤dovßnφ souboru. Je nutnΘ ji volat v₧dy po skonΦenφ dek≤dovßnφ, po ukonΦenφ prßce s ogg souborem, kdy₧ u₧ s nφm nebudeme nic d∞lat. Nemusφte volat funkci fclose pro zav°enφ datovΘho zdroje otev°enΘho nap°φklad funkcφ fopen, ov_clear volß fclose pro datov² zdroj sama. Vrcφ jen nulu.

    int ov_test(FILE *f,OggVorbis_File *vf,char *initial,long ibytes); - otevφrßnφ ogg souboru se vnit°n∞ provßdφ volßnφm dvou funkcφ. Funkce ov_open volß ob∞ za sebou, tato funkce volß jen prvnφ, kterß ov∞°φ ₧e zdroj je ogg vorbis (naΦte prvnφ hlaviΦky) a otestuje zda zdroj podporuje p°esouvßnφ (seeking).VrßcenΘ hodnoty menÜφ ne₧ nula op∞t znaΦφ chybu, nula je OK :)

    int ov_test_callbacks(void *datasource, OggVorbis_File *vf, char *initial, long ibytes, ov_callbacks callbacks); - varianta p°edchozφ funkce s mo₧nostφ zadat vlastnφ funkce pro prßci se soubory ve struktu°e ov_callbacks. Viz struktura ov_callbacks a funkce ov_open_callbacks. VrßcenΘ hodnoty menÜφ ne₧ nula op∞t znaΦφ chybu, nula je OK :)

    int ov_test_open(OggVorbis_File *vf); - dokonΦφ otevφrßnφ zdroje otev°enΘho pomocφ jednΘ z p°edchozφch dvou funkcφ. Vrßtφ-li nula, je vÜe OK. Hodnota menÜφ ne₧ nula je op∞t chyba.

Dek≤dovßnφ (dekomprese zvuku):


    long ov_read(OggVorbis_File *vf, char *buffer, int length, int bigendianp, int word, int sgned, int *bitstream); - funkce dek≤duje do bufferu *buffer ogg soubor. Buffer mß velikost length. Tolik se do n∞j vejde bajt∙ zvukov²ch dat. Parametr length kolik bajt∙ dek≤dovanΘho zvuku chceme do bufferu ulo₧it. DalÜφ parametry se t²kajφ v²stupnφho formßtu dat, v jakΘm formßtu chceme mφt dek≤dovan² zvuk. bigendian udßvß formßt bajt∙, big nebo little endian (0 - little endian, 1 - big endian,obvykle 0). word udßvß velikost slova, 1 - byte, 2 - slovo. Tj. volba mezi 8bitov²m a 16bitov²m v²stupem. sgned °φkß zda chceme signed int(hodnota 1) nebo unsigned int(hodnota 0). Obvykle se dßvß 2. Poslednφ je ukazatel na Φφslo aktußlnφho bitovΘho proudu. Vφce viz ve druhΘ Φßsti. Nßvratovß hodnota 0 znamenß ·sp∞ch, hodnoty menÜφ ne₧ nula chybu. Hodnoty v∞tÜφ ne₧ nula znamenajφ poΦet bajt∙ dek≤dovan²ch a ulo₧en²ch do bufferu. Funkce p°i jednom volßnφ dek≤duje maximßln∞ 4096 bajt∙.

P°esun v souboru (Seeking):


    int ov_raw_seek(OggVorbis_File *vf,long pos); - p°esune se na pozici pos v ogg souboru. Pozice se udßvß rozmezφ komprimovan²ch bajt∙ souboru. Rozmezφ zφskßte volßnφm funkce ov_raw_total (viz dßle) s parametrem -1. Pozici zadejte tak jako kdyby jste zadßvali offset v b∞₧nΘm binßrnφm nebo textovΘm souboru. Nßvratovß hodnota 0 znamenß ·sp∞ch, hodnoty menÜφ ne₧ nula chybu.

    int ov_pcm_seek(OggVorbis_File *vf,ogg_int64_t pos); - p°esune se na pozici pos v ogg souboru. Pozice se udßvß v audio vzorcφch. ╪eΦeno jinak, zadßte Φφslo audio vzorku od nuly (doufßm :)). Nßvratovß hodnota 0 znamenß ·sp∞ch, hodnoty menÜφ ne₧ nula chybu.

    int ov_time_seek(OggVorbis_File *vf, double s); - p°esune se na pozici pos v ogg souboru. Pozice se zadßvß jako Φas v sekundßch. Asi nejvhodn∞jÜφ funkce k p°esunu po souboru. Nßvratovß hodnota 0 znamenß ·sp∞ch, hodnoty menÜφ ne₧ nula chybu.



Informace o souboru:


    long ov_bitrate(OggVorbis_File *vf,int i); - vracφ pr∙m∞rn² datov² tok. Parametr i je Φφslo bitovΘho proudu (bitstreamu). U zdroj∙ kterΘ nepodporujφ p°esuny (seeking) je ignorovßn. Pokud chcete bitrate aktußlnφho bitstreamu, souboru s kter²m zrovna pracujete, zadejte -1. NßvratovΘ hodnoty menÜφ ne₧ nula znaΦφ chybu. Hodnoty v∞tÜφ ne₧ nula - pr∙m∞rn² datov² tok.

    long ov_streams(OggVorbis_File *vf); - vracφ poΦet logick²ch bitstream∙ v rßmci naÜeho fyzickΘho bitstreamu (ogg souboru). Vrßcenß hodnota 1 indikuje jeden logick² bitstream nebo zdroj kter² nepodporuje p°esuny (seeking). Hodnoty v∞tÜφ ne₧ jedna poΦet logick²ch bitstream∙.

    long ov_seekable(OggVorbis_File *vf); - vracφ zda zdrojov² soubor podporuje p°esuny (seeking) - nenulovß hodnota, nebo ne - hodnota 0.

    long ov_serialnumber(OggVorbis_File *vf,int i); - vracφ sΘriovΘ Φφslo bitovΘho proudu (bitstreamu) i. i m∙₧e b²t -1 pro aktußlnφ bitstream. Vracφ -1 pokud bitstream i neexistuje, jinak sΘriovΘ Φφslo.

    ogg_int64_t ov_raw_total(OggVorbis_File *vf,int i); - vracφ celkov² poΦet komprimovan²ch bajt∙ zadanΘho logickΘho bitstreamu. i = -1 pro aktußlnφ bitstream. Vracφ Φφslo v∞tÜφ ne₧ nula pokud usp∞je. Pokud je i = -1, jednß se o celkov² poΦet komprimovan²ch bajt∙ celΘho souboru.

    ogg_int64_t ov_pcm_total(OggVorbis_File *vf,int i); - stejnß jako p°edchozφ funkce, ale vracenß hodnota mß v²znam audio vzork∙. Pro vrßcenΘ hodnoty a parametr i platφ stejnß pravidla.

    double ov_time_total(OggVorbis_File *vf,int i); - stejnß jako ov_raw_total, ale vracenß hodnota je v sekundßch. Pro vrßcenΘ hodnoty a parametr i platφ stejnß pravidla.

    ogg_int64_t ov_raw_tell(OggVorbis_File *vf); - vracφ offset (urΦuje na jakΘ pozici od zaΦßtku souboru se bude Φφst a budou se provßd∞t dalÜφ operace) v souboru v komprimovan²ch bajtech.

    ogg_int64_t ov_pcm_tell(OggVorbis_File *vf); - stejnß jako p°edchozφ. Vrßcenß hodnota mß v²znam audio vzork∙.

    double ov_time_tell(OggVorbis_File *vf); - stejnß jako ov_raw_tell, ale vracφ offset v sekundßch.

    vorbis_info *ov_info(OggVorbis_File *vf,int link); - vracφ ukazatel na strukturu vorbis_info i bitstreamu. i = -1, vrßtφ strukturu pro aktußlnφ bitstream.

    vorbis_comment *ov_comment(OggVorbis_File *vf,int link); - vracφ ukazatel na strukturu vorbis_comment i bitstreamu. i = -1, vrßtφ strukturu pro aktußlnφ bitstream.

Obsah