言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

MinGW と SDL_mixer

音声をビット単位で細かく制御できる所が 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

例によって私の MinGW では Makefile そのままコンパイル出来ないのだが、私だけなのかなあ。

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);
}