音声をビット単位で細かく制御できる所が SDL を裸で使う利点なんだけど、ちょっとしたデモには面倒なので、手抜きをして SDL_mixer を使う事にした。
ダウンロードとコンパイル
ホームページ wget http://www.libsdl.org/projects/SDL_mixer/ からソースをダウンロードしてコンパイル。私の場合、VC と混ざるので configure の時に unset INCLUDE が必要だった。
テスト
http://jcatki.no-ip.org:8080/SDL_mixer/SDL_mixer_demos.zip のサンプルコードを試す。
$ gcc sdlwav.c -o sdlwav -Wall $(sdl-config --cflags) $(sdl-config --libs) -lSDL_mixer $ ./sdlwav.exe /c/WINDOWS/Media/tada.wav
SDL_mixer を使ったサンプル
上のサンプルコードは難しいし、そもそも音を全然ミックスしてないじゃないか!そこで、短くて端的な奴を作ってみた。
# コンパイル gcc mixer -o mixer.c $(shell sdl-config --cflags) $(shell sdl-config --libs) -lSDL_mixer # 実行 ./mixer.exe c:/WINDOWS/Media/tada.wav # 適当にクリックすると音が鳴る。
#include "SDL.h" #include "SDL_mixer.h" int main(int argc, char **argv) { int done= 0; int audio_buffers= 512; Mix_Music *music; if (argc < 2) { fprintf(stderr, "usage: %s wavefile\n", argv[0]); exit(1); } if(SDL_Init(SDL_INIT_AUDIO | SDL_INIT_VIDEO) < 0) exit(1); if(!(SDL_SetVideoMode(320, 200, 0, SDL_ANYFORMAT | SDL_DOUBLEBUF))) exit(2); if(Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, audio_buffers) < 0) exit(3); if(!(music= Mix_LoadMUS(argv[1]))) exit(4); Mix_VolumeMusic(SDL_MIX_MAXVOLUME); while(!done) { SDL_Event event; SDL_WaitEvent(&event); switch (event.type) { case SDL_QUIT : done= 1; break; case SDL_KEYDOWN : case SDL_MOUSEBUTTONDOWN : if(Mix_PlayMusic(music, 1) == -1) exit(5); break; } } Mix_FreeMusic(music); Mix_CloseAudio(); SDL_Quit(); return(0); }