OpenALでwavファイルの再生をしてみた
ソースファイルは Windows版がVisualStudio.NET2003用でWin32コンソールプロジェクト。 MacOSX版がXcode3.00用でCocoaアプリケーション。 MacOSXのプロジェクトをいじってないので実行ファイルはMacOSX10.5以降用かも? 現在のバージョンではIntelのCPU以外では動作しません。 PowerPCで動き次第バージョンアップします。
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; }
画面には何も表示されません。 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はデータ同じですが同時再生できます。
(Windows版)
(MacOSX版)
(Windows版)
(MacOSX版)
前に戻る?