- 追加された行はこの色です。
- 削除された行はこの色です。
*第15回目 OpenALで効果音再生 [#p0cc39b0]
OpenALでwavファイルの再生をしてみた
**動作環境 [#mfb5e739]
ソースファイルは
Windows版がVisualStudio.NET2003用でWin32コンソールプロジェクト。
MacOSX版がXcode3.00用でCocoaアプリケーション。
MacOSXのプロジェクトをいじってないので実行ファイルはMacOSX10.5以降用かも?
現在のバージョンではIntelのCPU以外では動作しません。
PowerPCで動き次第バージョンアップします。
**サンプルプログラム (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)~
[[前に戻る>プログラミング]]