FMOD Sound System + C# = Tutorial

TUTORIAL FMOD Sound System

Język: C#

Ponieważ nie znalazłem nigdzie w języku polskim tutoriala do biblioteki FMOD w języku C#, a sam musiałem przebrnąć przez, przyznam, dobrze napisaną dokumentację, postanawiam napisać ten oto krótki tutorial. Dlaczego FMOD? Bo jest prosty w obsłudze, darmowy do użytku niekomercyjnego, multiplatformowy, ma świetnie napisaną dokumentację, a przede wszystkim jest szybki, co docenią gracze i programiści.

PRZYGOTOWANIE

W tym tutorialu używam Visual Studio C# i polecam go wszystkim, którzy mają zamiar pisać aplikacje w tym języku. Na początku wypadałoby pobrać FMOD’a, można (a nawet trzeba) to zrobić na stronie http://www.fmod.org/index.php/download (specjalnie nie podaję linka bezpośredniego, ponieważ co rusz wychodzą nowe wersje). To co nas interesuje to FMOD Ex Programmers API. Wybieramy wersje, np. development, interesującą nas platformę (w tym wypadku Windows) i klikamy download. Po pobraniu instalujemy.

Tworzymy nowy projekt w Visual Studio C# (ja nazwałem go „fmodTutorial”), ograniczymy się jedynie do konsoli, więc klikamy Console Application. Od razu możemy kliknąć „Save All” (Ctrl + Shift + S), aby program utworzył foldery z projektem. Pierwsza rzecz którą musimy zrobić, to skopiować kilka plików. Wchodzimy więc do folderu w którym zainstalowaliśmy FMOD’a. Domyślnie: Program Files -> FMOD Sound System -> FMOD Programmers API Win32. Tam, z katalogu Api -> Csharp kopiujemy 3 pliki: fmod.cs, fmod_errors.cs i fmod_dsp.cs. Wklejamy je do katalogu głównego naszego projektu (domyślnie: Dokumenty -> Visual Studio 2008 -> Projects -> fmodTutorial).

Pliki, które skopiowaliśmy musimy dodać do naszego projektu. W oknie Solution Explorer klikamy PPM na nazwę projektu (fmodTutorial), Add -> Existing Item i dodajemy dwa skopiowane wcześniej pliki. Możemy już zacząć pisać kod.

GŁÓWNY OBIEKT

Tworzymy zmienną ‘result’ (do obsługi błędów) i główny obiekt klasy System, który jest niezbędny do obsługi biblioteki

FMOD.RESULT result;
FMOD.System system = null;

result = FMOD.Factory.System_Create(ref system);


Wszystkie metody biblioteki FMOD zwracają wartość FMOD.RESULT.OK kiedy operacja zakończy się sukcesem. Na razie jednak ten wątek zostawimy, powrócimy do niego w akapicie o obsłudze błędów przez FMOD’a.

Kolejnym krokiem jest inicjalizacja obiektu ‘system’. Czynimy to w ten sposób:

result = system.init(1, FMOD.INITFLAG.NORMAL, IntPtr.Zero);

Pierwszy argument funkcji to liczba typu int oznaczająca ilość kanałów, z których możemy skorzystać na raz (aby uniknąć zamieszania ustawiłem na jeden). Drugi to flagi bitowe, których więcej można znaleźć w dokumentacji biblioteki. Trzeci parametr ustawiamy na zero.

Spróbujmy teraz uruchomić nasz program. Pojawi się informacja, z której wynika, iż program nie może załadować pliku fmodex.dll. Wracamy więc do folderu Api, znajdującego się w głównym katalogu biblioteki FMOD i stamtąd kopiujemy tegoż dll’a do folderu bin -> Debug i bin -> Release. Tym razem przy próbie uruchomienia wszystko powinno zaskoczyć i zobaczymy na moment okienko konsoli. Chyba, że dodaliśmy na końcu programu

System.Console.Read();

Wtedy zniknie po naciśnięciu klawisza.

ODTWORZENIE DŹWIĘKU

Spróbujmy teraz odtworzyć jakiś dźwięk. Wpierw musimy go utworzyć, więc tworzymy nową zmienną typu Sound i tworzymy dźwięk za pomocą metody createStream.

FMOD.Sound sound = null;
result = system.createStream(„.”, FMOD.MODE.DEFAULT, ref sound);

W miejsce kropki wstawiamy pełną ścieżkę do pliku, który chcemy odtworzyć. Drugi parametr to flagi bitowe, podana powyżej jest domyślnym typem stworzenia dźwięku. Możemy jeszcze użyć, np. FMOD.LOOP.NORMAL, co włączy zapętlenie wybranego utworu. Istnieje jeszcze metoda createSound. Różnica między metodami createStream a createSound polega przede wszystkim na tym, że ta druga ładuje do pamięci cały plik, czego nie polecam z większymi plikami muzycznymi, ale stosuje się to do mniejszych (np. w grach). Ja założyłem, że chcemy odtworzyć jakiś plik w formacie mp3.

Po utworzeniu dźwięku możemy go odtworzyć metodą playSound. Tworzymy wpierw kanał dźwięku.

FMOD.Channel channel = null;
result = system.playSound(FMOD.CHANNELINDEX.FREE, sound, false, ref channel);

Pierwszy parametr to wybranie kanału, w którym chcemy odtworzyć dźwięk. Powyższy zapis wybiera pierwszy wolny kanał. Wcześniej zadeklarowaliśmy, że potrzebujemy tylko jeden kanał, gdybyśmy zrobili ich 100, można by było wpisać tam np. 54, a dla innego pliku 89, wtedy pliki odtwarzałyby się równocześnie. Drugi parametr to wcześniej utworzony dźwięk, który chcemy odtworzyć. Trzeci parametr ustawiamy na false jeśli chcemy, aby plik się zaczął odtwarzać. Jeśli ustawimy na true plik będzie spauzowany. Parametr czwarty to referencja do kanału.

PAUZOWANIE

Jeśli chcemy zatrzymać na chwilę nasz dźwięk, musimy wykorzystać metodę setPaused.

result = channel.setPaused(true);

Tu myślę jest wszystko jasne. Metoda setPaused przyjmuje jako argument wartość typu boolean, true oznacza, że plik ma zostać spauzowany, false natomiast odtwarza ponownie.

USTAWIANIE GŁOŚNOŚCI

Spróbujmy teraz zmniejszyć głośność odtwarzanego dźwięku o połowę. Posłużymy się metodą setVolume.

result = channel.setVolume(0.5f);

Metoda setVolume jako parametr przyjmuje liczbę typu float z zakresu od 0 do 1. Rzecz oczywista, 0 oznacza ciszę, a 1 głośność maksymalną.

POBIERANIE DŁUGOŚCI PLIKU

Przydatną funkcją jest pobranie długości odtwarzanego pliku. Wykorzystamy do tego metodę getLength.

uint length = 0;
result = sound.getLength(ref length, FMOD.TIMEUNIT.MS);

Tworzymy zmienną ‘length’ typu uint i przekazujemy przez referencję jako pierwszy parametr funkcji getLength. Drugi parametr to jednostki, w których chcemy odebrać długość pliku, powyższy zapis oznacza milisekundy. 1000ms = 1s.

USTAWIANIE POZYCJI ODTWARZANIA

Mając już długość naszego pliku muzycznego, możemy ustawić sobie miejsce, od którego ma się odtwarzać. Do tego wykorzystamy metodę setPosition.

uint position = 20000;
result = channel.setPosition(position, FMOD.TIMEUNIT.MS);

Tworzymy zmienną ‘position’ typu uint i ustawiamy wartość na 20000. To oznacza, że utwór powinien się odtworzyć od 20 sekundy. Oczywiście zamiast przekazywać zmienną jako parametr funkcji, możemy od razu wpisać 20000. Drugi parametr jest znany, to ustawienie jednostek na milisekundy.

USTAWIANIE TRYBU ODTWARZANIA

Możemy zmienić tryb odtwarzania dźwięku w trakcie jego trwania wykorzystując metodę setMode.

result = channel.setMode(FMOD.MODE.LOOP_NORMAL);

Tu chyba wszystko jest zrozumiałe. setMode jako parametr przyjmuje flagę bitową, powyższa ustawia dźwięk na zapętlenie.

OSBŁUGA BŁĘDÓW

Każda metoda w bibliotece FMOD zwraca wartość typu FMOD.RESULT, dzięki temu możemy w łatwy sposób sprawdzić jakie błędy generuje nasz program. To jest właśnie powód, dla którego przy każdym wykorzystaniu metody z biblioteki FMOD, przypisywałem zwracaną przez nią wartość do zmiennej ‘result’ typu FMOD.RESULT. Żeby zobaczyć jakie komunikaty generuje FMOD, musimy wpierw utworzyć metodę, która je będzie wypisywać.

static void ERRCHECK(FMOD.RESULT result)

{

if (result != FMOD.RESULT.OK)

{

System.Console.WriteLine(„FMOD: „ + result + ” – „ + FMOD.Error.String(result));

}

if (result == FMOD.RESULT.OK)

{

System.Console.WriteLine(„FMOD: „ + result + ” – „ + FMOD.Error.String(result));

}

}

Teraz po każdym przypisaniu do zmiennej ‘result’ wpisujemy ERRCHECK(result), np.:

result = FMOD.Factory.System_Create(ref system);
ERRCHECK(result);

Jeśli wszystko zostało napisane tak, jak należy, zobaczymy w konsoli kilka linijek napisów:

FMOD: OK – No errors.

Spróbujmy jednak zmienić nieco program i zepsuć ścieżkę do pliku z dźwiękiem zmieniając, np. jedną literkę. Zostanie wygenerowany taki błąd:

FMOD: ERR_FILE_NOTFOUND – File not found.

W ten sposób zgrabnie możemy wykorzystać możliwości obsługi błędów w bibliotece FMOD.

ZWOLNIENIE OBIEKTÓW FMOD

Aby zwolnić wszystkie obiekty FMOD, wystarczy użyć metody release.

system.release();

I to już wszystko, jeśli chodzi o podstawy programowania dźwięku w tej bibliotece. Polecam przejrzeć dokumentację biblioteki i próbować własnych sił, w pisaniu dźwięku do niewielkich gierek czy odtwarzaczy muzycznych. Po prostu pisać, pisać i jeszcze raz pisać kod;)

Na prośbę użytkownika zamieszczam archiwum zip z całym projektem (sam nie wiem czemu nie wstawiłem tego wcześniej…). Jeśli ktoś nie korzysta z VS to w pliku Program.cs znajduje się kod. Pobrać można z: mirror 1, mirror 2, mirror 3 lub mirror 4.

About these ads

7 odpowiedzi na „FMOD Sound System + C# = Tutorial

  1. da_rk pisze:

    Świetny tutorial, właśnie czegoś takiego szukałem. Jeszcze tylko gdyby to było możliwe przydał by sie przykładowy program z kodem źródłowym w c#. Bo chciałbym cos takiego napisac ale jestem początkującym i niestety nie radze sobie z wieloma rzeczami. Pozdrawiam

  2. primo pisze:

    Super artykuł. Przydało by się jeszcze parę słów o nagrywaniu. Byłbym bardzo wdzięczny za pomoc. POZDRAWAIAM

  3. bercik pisze:

    świetny tutek. Krótko, zwięźle i na temat opisuje bibliotekę FMOD. Pozdro.

  4. kirek pisze:

    Mogę prosić o wstawienie na inny mirror całego projektu ?:) bo z żadnego podanego już się nie da niestety go ściągnąć !

  5. James pisze:

    Thanks very much! This has been very useful :)

  6. Mharezlak96 pisze:

    Nie wiem czy to błąd tutaj, czy w nowej wersji jest coś inaczej, ale u mnie zamiast FMOD.INITFLAG.NORMAL ma być FMOD.INITFLAGS.NORMAL

  7. pablo pisze:

    Nie wiem co jest ale nie do końca dział. Podczas kompilacji wyskakuje że nie ma ani obiektu lub przestrzenie namespace MEMORY_USIING_SYSTEM. Jak ktoś zna jak rozwiązać problem to proszę o pomoc.

Dodaj komentarz

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

WordPress.com Logo

Komentujesz korzystając z konta WordPress.com. Log Out / Zmień )

Twitter picture

Komentujesz korzystając z konta Twitter. Log Out / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Log Out / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Log Out / Zmień )

Connecting to %s

Follow

Otrzymuj każdy nowy wpis na swoją skrzynkę e-mail.

%d bloggers like this: