第15回目 OpenALで効果音再生

OpenALでwavファイルの再生をしてみた

動作環境

Windows版がVisualStudio.NET2003用でWin32コンソールプロジェクト。
WindowsXP SP2で動作確認。
MacOSX版がXcode3.00用でCocoaアプリケーション。
IntelOSX10.5.5およびRosettaで動作確認。

サンプルプログラム (Windows版)

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版)

前に戻る


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2012-12-16 (日) 15:25:58 (2044d)