*第15回目 OpenALで効果音再生 [#p0cc39b0] OpenALでwavファイルの再生をしてみた **動作環境 [#mfb5e739] Windows版がVisualStudio.NET2003用でWin32コンソールプロジェクト。 WindowsXP SP2で動作確認。 MacOSX版がXcode3.00用でCocoaアプリケーション。 IntelOSX10.5.5およびRosettaで動作確認。 **サンプルプログラム (Windows版)[#c44bb092] file.cppおよびwave.cppはサンプルプログラムをダウンロードして見てください。 #author("2018-06-18T16:06:20+09:00","default:kuran","kuran") #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_20090819.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_20090819.zip)~ [[前に戻る>プログラミング]]