Zenedith's dev blog

Dałem się namówić.., szatanowi chyba..

Debian: OpenAL + OGG czyli Play Music #2

Było już o odtwarzaniu dźwięku w systemie Windows za pomocą OpenAL i dekodera ogg Vorbis. Postanowiłem opisać, jak można taki sam efekt uzyskać na systemie Debian. Na początek potrzebujemy biblioteki:

  • OpenAL – mamy możliwość instalacji w postaci pakietu, lecz jest on trochę „starej daty”. Ponieważ dostępne są tylko źródła, to go sobie skompilujemy sami. Źródła możemy pobrać z oficjalnej strony CreativeLabs lub ze strony OpenAL Soft.
  • biblioteki VorbisFile, Vorbis i Ogg są aktualne do zainstalowania z poziomu pakietów, więc polecam zainstalować je wszystkie poleceniem: aptitude install libvorbis-dev które zainstaluje nam również pozostałe biblioteki.
  • potrzebujemy również bibliotekę asound, którą zainstalujemy poleceniem: aptitude install libasound2-dev.


W systemie Debian (i pewnie innych systemach Unix’owych), biblioteki (pliki *.so będące odpowiednikiem Windowsowych *.dll oraz pliki *.a będące odpowiednikiem Windowsowych *.lib) trafiają do katalogu /usr/lib a nagłówki do katalogu /usr/include.

OpenAL możemy bardzo prosto i szybko skompilować przy pomocy narzędzia o nazwie CMake, które generuje pliki konfiguracyjne w zależności od naszych potrzeb i systemu operacyjnego (dostępna jest wersja na Windows i Linux). Oczywiście projekt musi zawierać konfigurację wytworzoną w CMake, którą projekt OpenaAL posiada.

W celu użycia CMake musimy:

  • zainstalować pakiet CMake poleceniem: aptitude install cmake
  • w katalogu gdzie rozpakowaliśmy źródła OpenAL wydać polecenie: ccmake . (tak, tu jest kropka)
  • w graficznym konfiguratorze wcisnąć klawisz c i wybrać żądane opcje: dla Debiana będzie to m.in: ALSA[ON],OSS[ON], katalog dla pliku *.so (lib) oraz katalog executable gdzie wygenerowany zostanie przykładowy program korzystający z OpenAL, oraz wyłączyć następujące opcje: DSOUND[Off], SOLARIS[Off], WINMM[OFF]. Następnie jeszcze raz wcisnąć klawisz c i ostatecznie klawisz g, który wygeneruje potrzebne pliki, w tym bardzo ważny plik config.h. Pozostaje tylko wydać polecenie make aby kompilacja się rozpoczęła.

Jeśli kompilacja odbyła się pomyślnie, w katalogu który ustawiliśmy jako katalog library pojawią się 3 pliki, a dokładniej jeden plik *.so wraz z dwoma dowiązaniami do niego pod bardziej czytelną nazwą. Możemy też sprawdzić aplikację testową, która skompilowała się do katalogu ustawionego jako bin w konfiguratorze.

Jeśli nie chcemy posługiwać się CMake, możemy sobie sami skompilować bibliotekę np. w Eclipse z CDT. W tym celu musimy posiadać plik config.h, który powstaje przy generowaniu ustawień z CMake’a, ale skoro nie chcemy/możemy go uruchomić to zamieszczam jego treść poniżej (dla Linux’a):

#ifndef CONFIG_H
#define CONFIG_H
/* Define to the library version */
#define ALSOFT_VERSION "1.6.372"
/* Define if we have the ALSA backend */
#define HAVE_ALSA
/* Define if we have the OSS backend */
#define HAVE_OSS
/* Define if we have the Solaris backend */
/* #undef HAVE_SOLARIS */
/* Define if we have the DSound backend */
/* #undef HAVE_DSOUND */
/* Define if we have the Windows Multimedia backend */
/* #undef HAVE_WINMM */
/* Define if we have dlfcn.h */
#define HAVE_DLFCN_H
/* Define if we have the sqrtf function */
#define HAVE_SQRTF
/* Define if we have the acosf function */
#define HAVE_ACOSF
/* Define if we have the strtof function */
#define HAVE_STRTOF
/* Define if we have stdint.h */
#define HAVE_STDINT_H
/* Define if we have the __int64 type */
/* #undef HAVE___INT64 */
/* Define to the size of a long int type */
#define SIZEOF_LONG 4
/* Define to the size of a long long int type */
#define SIZEOF_LONG_LONG 8
/* Define to the size of an unsigned int type */
#define SIZEOF_UINT 4
/* Define to the size of a void pointer type */
#define SIZEOF_VOIDP 4
/* Define if we have GCC's destructor attribute */
#define HAVE_GCC_DESTRUCTOR
/* Define if we have pthread_np.h */
/* #undef HAVE_PTHREAD_NP_H */
/* Define if we have float.h */
#define HAVE_FLOAT_H
/* Define if we have fenv.h */
#define HAVE_FENV_H
/* Define if we have fesetround() */
#define HAVE_FESETROUND
/* Define if we have _controlfp() */
/* #undef HAVE__CONTROLFP */
#endif

Teraz należałoby zrobić porządki w systemie nagłówków, czyli katalogów Include:
Kopiujemy katalog AL z katalogu include archiwum OpenAL do katalogu /usr/include (powstaje katalog /usr/include/AL) oraz tworzymy katalog /usr/include/OpenAL32 i wrzucamy tam pliki z katalogu OpenAL32/Include archiwum OpenAL.

Jest jednak pewien problem – otóż plik config.h sam z siebie nie wpływa na ładowanie nagłówków. Oznacza to, że jeśli nie chcemy użyć np. DSOUND i ustawimy tą opcję na OFF to nie wpłynie ona na to, żeby rzeczywiście tego pliku nie kompilować. Ma to takie znaczenie, że po prostu pod linux’em nie ma biblioteki Direct Sound. Dlatego pozwoliłem sobie dodać strażników do plików alsa.c, dsound.c,oss.c,solaris.c oraz winmm.c w celu nie ładowania ich zawartości przy odpowiednich flagach. W ten sposób kod jest zależny od ustawień z pliku config.h, nie tylko wtedy kiedy jest używany z CMake.
Drugi problem który pojawi się przy kompilacji to brak stałej PTHREAD_MUTEX_RECURSIVE występującej w pliku /usr/include/OpenAL32/alMain.h o następującej treści:

/usr/include/OpenAL32/alMain.h ‘PTHREAD_MUTEX_RECURSIVE’ undeclared (first use in this function)

W moim przypadku zamieniłem nazwę stałej na PTHREAD_MUTEX_RECURSIVE_NP.

Ostatecznie paczkę z odpowiednim podziałem plików, poprawionym PTHREAD_MUTEX_RECURSIVE oraz osobnym katalogiem Include oraz plikami config.h dla Windowsa i Linux’a można ściągnąć tutaj (prawidłowe rozszerzenie to rar).

Stworzenie biblioteki statycznej libopenal.a lub dynamicznej libopenal.so sprowadza się w Eclipse do:

  1. utworzenia projektu: Empty Static Library/Empty Shared Library o nazwie openal,
  2. przeniesienia do niego katalogów Alc oraz OpenAL32 oraz pliku config.h dla linux’a (lub Windows’a) z udostępnionego przeze mnie powyższego archiwum,
  3. skopiowania zawartości katalogu Include z archiwum do ogólnie dostępnego w systemie miejsca (tak jak wspomniałem wcześniej, warto przenieść oba katalogi do /usr/include nadpisując pliki pochodzące z oryginalnego archiwum ze strony CreativeLabs,
  4. odświeżenia zawartości Eclipse po wkopiowaniu katalogów Alc i OpenAL32 (nie tego z /usr/include) do projektu i wykonania kompilacji dla biblioteki statycznej lub dodatkowego ustawienia w linker’ze dodatkowej biblioteki asound.

zrzutekranu-properties-for-lib

Otrzymany plik libopenal.a lub libopenal.so kopiujemy do katalogu /usr/lib. Teraz możemy skompilować przykładowy projekt, w którym wykorzystamy wszystkie biblioteki, które wcześniej ściągnęliśmy wraz z OpenAL. Należy więc udać się na zakładkę ustawień linker’a i ustawić biblioteki statyczne tak jak zostało to pokazane poniżej ( podany przykład projektu jest pod Windows i Visual Studio ale najważniejszy jest pokazany tam kod – przede wszystkim nie musimy podawać ścieżek do katalogów include i lib, ponieważ ściągając pakiety zostały one zainstalowane w katalogach /usr/include i /usr/lib a pliki od OpenAL sami przekopiowaliśmy do tych katalogów, dzięki czemu Eclipse sam je tam odnajdzie):

properties-for-simple_openal

Jak można zauważyć, jako pierwsza występuje tam biblioteka od alsa sound, czyli asound, następnie skompilowana przed chwilą biblioteka openal i pozostałe biblioteki związane z obsługą ogg (dekodowanie przez vorbis). Jeśli w katalogu /usr/include nie mamy jeszcze podkatalogów AL oraz OpenAL32 to należy je tam przekopiować z mojego archiwum. Kompilacja powyższego przykładu powinna dać w rezultacie aplikację, która potrafi odegrać plik ogg, który przekazujemy do niej jako ścieżkę do pliku ogg.

Reklamy

11 Styczeń, 2009 - Posted by | debian, engine | , ,

1 komentarz »

  1. I found this excellent bunk bed design online and I thought I knew a lot about bi
    fold patio doors and their difference variations upon the classic single bed on top of each other.

    Komentarz - autor: patio door | 16 Lipiec, 2013 | Odpowiedz


Skomentuj

Proszę zalogować się jedną z tych metod aby dodawać swoje komentarze:

Logo WordPress.com

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

Zdjęcie z Twittera

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

Facebook photo

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

Google+ photo

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

Connecting to %s

%d blogerów lubi to: