Warsztat.GDCompo!ProjektyMediaArtykułyQ&AForumOferty pracyPobieranie

Opisz napotkaną sytuację, a redakcja niezwłocznie znajdzie rozwiązanie!

wyślij anuluj

Podstawy dźwięku w bibliotece FMOD

Tekst został importowany z Warsztatowych artykułów. Jego oryginalnym autorem jest Tomasz Grel. Jeżeli został importowany poprawnie, usuń ten szablon!

Wstęp

Piszę ten artykuł ponieważ miałem problemy ze znalezieniem w Internecie polskojęzycznego tutoriala lub artykułu o dźwięku w bibliotece fmod i musiałem korzystać z dokumentacji , która była napisana po angielsku i przed czytaniem której chciałbym was uchronić. Wybrałem właśnie tę bibliotekę ponieważ:

  • Jest wysokopoziomowa i nie trzeba jej opakowywać
  • Jest darmowa dla produktów niekomercyjnych
  • Posiada przejrzystą i łatwą do zrozumienia dokumentację
  • Obsługuje wiele formatów plików
  • Umożliwia łatwe obsługiwanie błędów
  • Jest szybka dzięki czemu idealnie nadaje się do używania w grach komputerowych
Wszystkie pliki nagłówkowe biblioteki i przede wszystkim dokumentację możecie znaleźć pod tym adresem

Utworzenie obiektu głównego

Na początek utworzymy obiekt klasy System ,który będzie nam potrzebny do wielu innych operacji :

FMOD::System *system;//deklaracja wskaźnika na obiekt klasy System
if(FMOD::System_Create(&system)!= FMOD_OK ) 
MessageBox(hOkno,”Utworzenie obiektu głównego fmod nie powiodło się ”,”error”,MB_OK.);//utworzenie obiektu
Metoda ta (tak jak wszystkie inne funkcje biblioteki fmod zwraca wartość FMOD_OK jeśli operacja zakończy się powodzeniem. Po utworzeniu obiektu głównego należy go zainicjalizować :
if(system->init(10, FMOD_INIT_NORMAL,NULL)!=FMOD_OK)
MessageBox(hOkno,”inicjalizacja nie powiodła się”,"error”,MB_OK.);//inicjalizacja obiektu głównego fmod
Pierwszy parametr to liczba typu int oznaczająca ilość wirtualnych kanałów z których będziemy korzystać. Drugi to flagi bitowe. Więcej informacji o flagach bitowych znajdziecie w dokumentacji biblioteki. Trzeci parametr ustawiamy na 0

Odtworzenie dźwięku z pliku

Aby odtworzyć dźwięk z pliku musimy najpierw go utworzyć za pomocą metody createSound:

FMOD::Sound *sound;//deklarujemy wskaźnik na obiekt typu Sound
if(system->createSound("tutaj podajemy ścieżkę do pliku", FMOD_DEFAULT, 0, &sound)!=FMOD_OK)
MessageBox(hOkno,”nie udało się utworzyć dźwięku”,”error”,MB_OK.);//tworzymy dźwięk
Pierwszy parametr metody createSound to ścieżka do pliku z dźwiękiem, kolejny to flagi bitowe. Najważniejsze z nich to:
  • FMOD_DEFAULT – domyślny typ utworzenia dźwięku
  • FMOD_LOOP_OFF- wyłącza zapętlenie dźwięku(zawarte we fladze FMOD_DEFAULT)
  • FMOD_LOOP_NORMAL -włącza zapętlenie
Więcej flag bitowych znajdziecie w dokumentacji biblioteki fmod. Trzeci parametr funkcji createSound to wskaźnik na strukturę FMOD_CREATESOUNDEXINFO. Można tu wstawić NULL. Ostatni parametr to referencja do wskaźnika na obiekt klasy sound który zostanie utworzony Po wczytaniu dźwięku z pliku możemy go odtworzyć, za pomocą metody playSound:
FMOD::Channel *channel;//tworzymy kanał dźwięku
if(system->playSound(FMOD_CHANNEL_FREE, sound, false, &channel)!=FMOD_OK)
MessageBox(hOkno,”nie udało się odtworzyć dźwięku“,”error”,MB_OK);
Na początku deklarujemy kanał na którym będzie odgrywany nasz dźwięk. Dzięki niemu możemy na przykład zmniejszać głośność. Następnie odtwarzamy dźwięk za pomocą metody playSound. Pierwszy parametr to identyfikator kanału użyłem FMOD_CHANNEL_FREE , aby kompilator sam wybrał wolny kanał. Kolejny parametr to dźwięk który wcześniej utworzyliśmy za pomocą metody createSound. Parametr trzeci jest typu bool i określa czy dźwięk ma być zatrzymany czy nie. Ustawienie true oznacza , że dźwięk nie zostanie odtworzony zaraz po wywołaniu metody playSound, lecz dopiero po wywołaniu funkcji SetPause , którą omówimy później. Parametr czwarty to referencja do utworzonego kanału. Parametr ten można ustawić na NULL, ale wtedy nie będzie można ani ustawić głośności, ani nawet zatrzymać odgrywania dźwięku. Dlatego parametr czwarty powinno ustawiać się na 0 tylko wtedy , gdy odtwarzamy niezapętloną próbkę.

Ustawianie głośności dźwięku

Głośność danego kanału możemy ustawić dzięki metodzie setVolume:

if(channel->setVolume(0.5f)!=FMOD_OK)
MessageBox(hOkno,” Nie udało się ustawić głośności”, ”error” , MB_OK);
Jedyny parametr metody setVolume to oczywiście głośność wyrażona w liczbie rzeczywistej. Minimalna wartość wynosi 0 i oznacza cisze a maksymalna wynosi 1 i oznacza maksymalną głośność.

Ustawianie trybu dźwięku

Za pomocą metody setMode możemy ustawiać sposób w jaki program będzie odtwarzał dźwięk. Możemy na przykład określić czy dźwięk ma być zapętlony , a jeśli tak to w jaki sposób lub czy ma to być dźwięk 2D czy 3D, Dokładnie w taki sam sposób jak przy tworzeniu nowego dźwięku. Oto przykład wykorzystania funkcji setMode:

if( sound->setMode( )!=FMOD_OK)
MessageBox(hOkno , ”ustawienie trybu dźwięku nie powiodło się” , ”błąd” , „MB_OK.);
Metoda ta przyjmuje tylko jeden parametr typu FMOD_MODE , są to flagi bitowe oznaczające tryb dźwięku. Takie same jak w przypadku metody createSound

Zatrzymanie i ponowne odtwarzanie dźwięku

Aby zatrzymać lub ponownie odtworzyć dźwięk należy posłużyć się metodą setPaused:

if(channel->setPaused(true)!=FMOD_OK)
MessageBox(hOkno,”setPaused nie zadziałało”,” error”,MB_OK);
Metoda ta przyjmuje jeden parametr typu bool. Wartość true powoduje zatrzymanie odtwarzania, a wartość false oznacza odtwarzanie.

Ustawianie pozycji odtwarzania

Przy odtwarzaniu długich próbek może się przydać metoda setPosition ustalająca pozycję odtwarzania.

if(chanel->setPosition(  1000, FMOD_TIMEUNIT_MS  )!=FMOD_OK)
MessageBox(hOkno,”ustalenie pozycji odtwarzania nie powiodło się”,”error”,MB_OK); 
Użycie tej funkcji w ten sposób oznacza , że wszystkie próbki odtwarzane na kanale chanel będą odtwarzane od 1000 milisekundy. Metoda ma dwa parametry : pierwszy to pozycja od której ma być rozpoczynane odtwarzanie, a drugi to stała określająca jakich jednostek czasu użyjemy. Użyta tu stała FMOD_TIMEUNIT_MS oznacza , że użyjemy milisekund.

Ustawianie punktów pętli

Czasami w naszych grach potrzebujemy odtwarzać zapętlony dźwięk od środka próbki, aby ustawić od którego i do którego miejsca ma być odtwarzany dźwięk w pętli posłużymy się funkcją setLoopPoints :

if(Sound->setLoopPoints(1000,FMOD_TIMEUNIT_MS,3000,FMOD_TIMEUNIT_MS)!=FMOD_OK)
MessageBox(hOkno,”ustawienie punktów pętli nie powiodło się”,”error”,MB_OK);
Metoda ta przyjmuje 4 parametry: pierwszy oznaczający punkt od którego rozpoczynamy odtwarzanie dźwięku. Parametry drugi i czwarty to stałe oznaczające jednostki w jakich podamy czas rozpoczęcia i zakończenia odtwarzania dźwięku. Ja podałem stałe FMOD_TIMEUNIT_MS , ponieważ chciałem użyć milisekund. Parametr trzeci to punkt w którym próbka ma zostać odtworzona ponownie. Wywołanie takie jak powyżej oznacza , że dźwięk zostanie odtworzony od 1000 milisekundy , i po 2000 milisekund znowu wróci milisekundy numer 1000. Taką sama metodę można stosować także dla obiektu kanału.

Pobieranie długości dźwięku

Do pobierania długości dźwięku służy metoda getLength. Może okazać się przydatna na przykład kiedy musimy określić długość próbki , którą nagraliśmy, albo gdy chcemy dokładnie ustawić punkty zapętlenia dźwięku. Używamy jej w ten sposób :

int length; 
if(sound->getLength( &length , FMOD_TIMEUNIT_MS)!=FMOD_OK)
MessageBox(hOkno, ”pobranie długości dźwięku nie powiodło się” , ”error”, MB_OK.);
Na początku deklarujemy zmienną typu int. Następnie przekazujemy ją do funkcji getLength w formie referencji jako pierwszy parametr. Funkcja zwróci wartość właśnie przez tą zmienną. Drugi parametr to znana nam już stała typu FMOD_TIMEUNIT oznaczająca jednostki w jakich funkcja ma zwrócić długość dźwięku. Po raz kolejny podajemy tu stałą FMOD_TIMEUNIT_MS oznaczającą milisekundy.

Zwolnbienie obiektów fmod

Na koniec trzeba jeszcze zwolnić utworzone wcześniej obiekty. Nie musimy zwalniać ich wszystkich, wystarczy ,że wywołamy metodę system->release(), a wszystkie obiekty fmod zostaną zwolnione:

system->release();
Myślę , że to już wszystkie informacje potrzebne do programowania prostego dźwięku do gier za pomocą biblioteki fmod. Życzę miłego kodowania :) .

Jeśli ktoś ma jakieś wątpliwości lub pytania może pisać na adres : [email protected]

Tekst dodał:
Adam Sawicki
25.07.2007 13:37

Ostatnia edycja:
Adam Sawicki
25.07.2007 13:37

Kategorie:

Aby edytować tekst, musisz się zalogować.

# Edytuj Porównaj Czas Autor Rozmiar
#1 edytuj 25.07.2007 13:37 Adam Sawicki 9.22 KB
Zwykły
Do sprawdzenia
Do akceptacji
  • k_b (@xkb) 25 lipca 2007 21:40
    Fajnie, muzyczka do GP się przyda... a tak, od razu mam mały tutorial :) ++ ode mnie
  • Maciej Kurowski (@Kurak) 26 lipca 2007 10:53
    k_b - lepiej korzystaj z oficjalnych tutoriali do fmoda (są w chm-ie dołączonym do instalki fmoda) - są dużo bardziej przejrzyste i łatwe w zrozumieniu niż ten zaprezentowany tutaj (autorstwa Tomasza).
  • ~TSr 26 lipca 2007 19:43
    Tak oryginalna dokumentacja jest niezła. Czemu udostępniasz to jako .doc? Można chociaż do .pdf wyeksportować...
  • moriturius (@moriturius) 27 lipca 2007 19:13
    lipa ze DOC i lipa ze takie badziewne formatowanie. zreszta i tak korzystam z Audiere :P
  • Tomek Grel (@Grelo) 27 lipca 2007 19:34
    już jest w html :)
  • Maciej Kurowski (@Kurak) 27 lipca 2007 21:24
    Właśnie, Audiere rlz... bo darmowe do komercyjnych zastosowań jest :D
  • Maciej Kurowski (@Kurak) 27 lipca 2007 21:25
    Ej, co to ma być: "która była napisana po angielsku i przed czytaniem której chciałbym was uchronić"?!?!?! Tożto jawna demoralizacja nowych pokoleń koderskich! ;)
  • ~panda 28 lipca 2007 10:16
    ej to ja mam pomysł ^^ od dziś piszemy Tutoriale/Artykuły (niepotrzebne skreślić) w języku angielskim na wzór gamedev.net.
  • moriturius (@moriturius) 28 lipca 2007 22:59
    panda - raczej sredni pomysl.

    chocby dlatego, ze wtedy wiekszosc tutoriali nie mialaby sensu bo w jezyku angielskim juz sa :D
  • ~Chlebek 30 lipca 2007 14:20
    No. Nareszcie jakiś polski kurs FMOD-a. Ale niestety na tyle późno że już zdążyłem przeczytać dolumentację ;D
  • Paweł W. (@dRaiser) 20 sierpnia 2007 14:35
    Fajne, chociaż sam nie wiem czy nie zdecydować się na irrKlang - przynajmniej nie ma problemów z licencją w razie projektów komercyjnych (myślę przyszłościowo;)). Sam art przejrzysty i przydatny - ++.
  • ~ToMaS 25 października 2007 11:12
    Wszystko fajnie ale uzytkownicy piszacy w C++ przy uzyciu srodowiska DevC++, Eclipse lub CodeBlocks (kompilator MinGW32) niestety musza sobie odpuscic FMOD'a w wersji 4.x poniewaz biblioteka statyczna dolaczona do SDK 'libfmodex.a' nie wspolpracuje z jezykiem C++ tylko z ANSII C. Niewiadomo dlaczego po dolaczeniu biblioteki do projektu 'C++', mingw32 nie jest w stanie odnalesc prototypow niektorych f-cji. Jesli ktos zna odpowiedz na ten problem zglaszam wielka prosbe o przeslanie go na mojego maila: [email protected]
  • Mateusz Chachura (@madteus) 14 czerwca 2009 20:26
    ToMaS a dlaczego na meila?? Ja też chcialbym wiedzieć jak to rozwiązać bo mam ten sam problem :p fajnie by bylo przeczytac to w komentarzu (jakiś link albo krótka odpowiedz) ;)
  • Napisz komentarz:
    Aby dodać swój komentarz, musisz się zalogować.
Licencja Creative Commons

Warsztat używa plików cookies. | Copyright © 2006-2017 Warsztat · Kontakt · Regulamin i polityka prywatności
build #ff080b4740 (Tue Mar 25 11:39:28 CET 2014)