┌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:
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
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
|