Home | Lesson | Game | Tool | Link

C03.SDL_Mixer

SDL_Mixerを使用したサウンドの再生方法を紹介します。


準備
SDL_Mixerを使用するための準備をします。
SDL_mixer.libをリンクしてください。
SDL_mixer.hをインクルードしてください。
#ifdef WIN32
	#include <windows.h>
	#pragma comment(lib, "Irrlicht.lib")

	//SDL用設定
	#pragma comment(lib, "SDL.lib")
	#pragma comment(lib, "SDLmain.lib")
	#pragma comment(lib, "SDL_mixer.lib")
	//C/C++→コード生成→ランタイムライブラリ→マルチスレッドDLLに変更
#endif

#include <SDL/SDL.h>
#include <SDL/SDL_syswm.h>//SysWMinfo使用
#include <SDL/SDL_mixer.h>

初期化
SDL_Mixerを使用する場合は、事前にSDL_Init()を実行しておきます。
(ここでは、createDeviceSDL()で初期化をしているので記述していません。)
※Mix_OpenAudioでバッファサイズを指定する場合、サイズが低いと
 音が汚くなるので余裕をもって設定しましょう。
	//事前にSDL_Init()を実行すること
	// open 44.1KHz, signed 16bit, system byte order,
	//      stereo audio, using 4096 byte chunks
	if(Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 4096) == -1)
		return 1;

効果音・BGMの読み込み
ファイル名を指定して、それぞれの形式で呼び出します。
	//効果音ファイルを読み込む
	Mix_Chunk *sample;
	sample = Mix_LoadWAV("data/sound/choice.wav");

	//BGMファイルを読み込む
	Mix_Music *music;
	music = Mix_LoadMUS("data/sound/be01.wav");

効果音・BGMの再生
メインループ内で呼び出す場合は、BGMが再生されていない場合は再生する、
というように1クッション必要になります。
	while(device->run())
	{
		driver->beginScene(true, true, 0xFF6060FF);

		//キー処理
		keyFunc(device);

		//効果音再生
		//Mix_PlayChannel(-1, sample, 0);

		//BGM再生
		if(Mix_PlayingMusic() == 0)
			Mix_PlayMusic(music,-1);
		

		//シーンの描画
		smgr->drawAll();

		driver->endScene();
	}

終了処理
演奏している効果音やBGMを停止・開放し、AUDIOを閉じます。
	//終了処理
	Mix_HaltMusic();//演奏停止
	Mix_FreeChunk(sample);
	Mix_FreeMusic(music);
	Mix_CloseAudio();



IrrKlangと比較して
SDL_MixerはSDLを使用しなくい場合でも、SDL_Init()を呼び出す必要があります。
そのため、使用するDLLが多くなってしまいます。
効果音を再生する場合も、チャネル数分しか再生できず、
多くの効果音を再生させなければならない場合は、管理が大変になりそうです。
また、古いライブラリでもあるので、新しいライブラリのIrrKlangの方が
使いやすいかと思います。

ただし、PS3LinuxでもSDLが使用できるため、そのことを考えると
SDL_Mixerを使用しておくのもいいかもしれません。

ダウンロード
今回作成したファイル一式です。

宿題
1.マウスやキーボードを押したら効果音が鳴るようにしてみましょう。