*第15回目 OpenALで効果音再生 [#p0cc39b0]
 OpenALでwavファイルの再生をしてみた
**動作環境 [#mfb5e739]
 ソースファイルは
 Windows版がVisualStudio.NET2003用でWin32コンソールプロジェクト。
 MacOSX版がXcode3.00用でCocoaアプリケーション。
 MacOSXのプロジェクトをいじってないので実行ファイルはMacOSX10.5以降用かも?
**サンプルプログラム (Windows版)[#c44bb092]
 file.cppおよびwave.cppはサンプルプログラムをダウンロードして見てください。

 #include "stdafx.h"
 #include <conio.h>
 #include "standard.h"
 #include "OpenAL/include/al.h"
 #include "OpenAL/include/alc.h"
 #include "file.hpp"
 #include "wave.hpp"
 
 #pragma comment(lib, "OpenAL/libs/Win32/OpenAL32.lib")
 
 int _tmain(int argc, _TCHAR* argv[])
 {
 	// ファイル読み込み
 	File file[3];
 	Wave wave[3];
 	if(!file[0].Load(_T("hiyoko_01_48.wav")))
 	{
 		return -1;
 	}
 	if(!file[1].Load(_T("jump_01_take2.wav")))
 	{
 		return -1;
 	}
 	if(!file[2].Load(_T("tue_get.wav")))
 	{
 		return -1;
 	}
 	wave[0].Load(file[0].GetBuffer());
 	wave[1].Load(file[1].GetBuffer());
 	wave[2].Load(file[2].GetBuffer());
 	// OpenAL初期化
 	ALCdevice* device_handle;
 	ALCcontext* context_handle;
 	device_handle = alcOpenDevice(NULL);
 	context_handle = alcCreateContext(device_handle, NULL);
 	alcMakeContextCurrent(context_handle);
 	// buffer作成
 	ALuint buffer_handle[3];
 	alGenBuffers(3, buffer_handle);
 	alBufferData(buffer_handle[0], (wave[0].GetChannel() == 1) ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16, wave[0].GetBuffer(), wave[0].GetSize(), wave[0].GetFrequency());
 	alBufferData(buffer_handle[1], (wave[1].GetChannel() == 1) ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16, wave[1].GetBuffer(), wave[1].GetSize(), wave[1].GetFrequency());
 	alBufferData(buffer_handle[2], (wave[2].GetChannel() == 1) ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16, wave[2].GetBuffer(), wave[2].GetSize(), wave[2].GetFrequency());
 	// source作成
 	ALuint source_handle[5];
 	alGenSources(5, source_handle);
 	alSourcei(source_handle[0], AL_BUFFER, buffer_handle[0]);
 	alSourcei(source_handle[1], AL_BUFFER, buffer_handle[1]);
 	alSourcei(source_handle[2], AL_BUFFER, buffer_handle[2]);
 	alSourcei(source_handle[3], AL_BUFFER, buffer_handle[2]);
 	alSourcei(source_handle[4], AL_BUFFER, buffer_handle[2]);
 	// 再生
 	for(;;)
 	{
 		int c;
 		c = getch();
 		switch(c)
 		{
 		case '1':
 			alSourcePlay(source_handle[0]);
 			break;
 		case '2':
 			alSourcePlay(source_handle[1]);
 			break;
 		case '3':
 			alSourcePlay(source_handle[2]);
 			break;
 		case '4':
 			alSourcePlay(source_handle[3]);
 			break;
 		case '5':
 			alSourcePlay(source_handle[4]);
 			break;
 		}
 		if(c == 0x1B)
 		{
 			break;
 		}
 	}
 	// 全sourceが再生終了するまで待つ
 	// (終了時に別に待たなくてもいいが再生状態取得のサンプルとして)
 	ALint state;
 	int32_t i;
 	for(;;)
 	{
 		bool end = true;
 		for(i = 0; i < 5; i ++)
 		{
 			alGetSourcei(source_handle[i], AL_SOURCE_STATE, &state);
 			if(state != AL_PLAYING)
 			{
 				end = false;
 			}
 		}
 		if(end)
 		{
 			break;
 		}
 	}
 	// 全source停止
 	for(i = 0; i < 5; i ++)
 	{
 		alSourceStop(source_handle[i]);
 	}
 	alDeleteSources(5, source_handle);
 	alDeleteBuffers(3, buffer_handle);
 	alcMakeContextCurrent(NULL);
 	alcDestroyContext(context_handle);
 	alcCloseDevice(device_handle);
 	return 0;
 }

**操作方法 [#mdc8f704]
 画面には何も表示されません。
 1〜5のキーで効果音再生、ESCキーで終了。
 1 hiyoko_01_48.wav (16bit、48KHz、モノラル)
 2 jump_01_take2.wav (16bit、44.1KHz、モノラル)
 3 tue_get.wav (16bit、44.1KHz、モノラル)
 4 3と一緒
 5 3と一緒
 3〜5はデータ同じですが同時再生できます。
**ダウンロード [#m919d731]
***実行ファイル [#w7e57147]
(Windows版)
#ref(http://www.ripple.gr.jp/~kuran_kuran/bin/download/openal_sample_windows_20090703.zip)~
(MacOSX版)
#ref(http://www.ripple.gr.jp/~kuran_kuran/bin/download/openal_sample_osx_20090705.zip)~
***ソースファイル [#pe95f051]
(Windows版)
#ref(http://www.ripple.gr.jp/~kuran_kuran/bin/download/openal_sample_windows_source_20090813.zip)~
(MacOSX版)
#ref(http://www.ripple.gr.jp/~kuran_kuran/bin/download/openal_sample_osx_source_20090705.zip)~

[[前に戻る>プログラミング]]


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS