Jumat, 17 Juli 2015

Contoh Program OpenAL

Pagi hari yang sepi karena tetangga dan teman-teman sudah pada pulang kampung...


Selamat pagi rekan-rekan  sekalian dan sobat-sobit, pagi ini ogut akan memberikan contoh program OpenAL yang menghasilkan efek suara atau bahasa kerennya sound effect.

Efek suara dalam suatu game sangat mendukung kualitas game tersebut, dengan efek suara yang optimal maka kesenangan pemain dalam memainkan suatu game akan meningkat sehingga membuat game mempunyai nilai lebih dan membuka kesempatan pada game tersebut untuk menjadi popular.

Pada era 80-an ada suatu game di PC bernama Digger, game ini mempunyai penampilan yang sederhana dan cara memainkan game inipun sangat sederhana, tetapi ada yang membuat pemain senang memainkan game tersebut, salah satunya adalah suara dari game tersebut. Coba bayangkan jika game tersebut bisu atau tak bersuara maka game tersebut tidak akan populer.


Instalasi OpenAL
Tidak seperti OpenGL, OpenAL belum ada di Visual C++ pada saat kita instalasi, sehingga kita perlu melakukan instalasi sendiri.

Langkah pertama jalankan file OpenAL11CoreSDK.EXE, lalu klik tombol Next.


Pilih I accept...(lihat gambar di bawah) lalu klik tombol Next.


Klik tombol Next pada saat proses instalasi menanyakan tentang folder tujuan untuk OpenAL.


Klik tombol Install.


Pilih No, I don’t want help files integration. Lalu klik tombol Next.


Pilih Yes, launch the OpenAL redist and finish. Lalu klik tombol Next.


Dan terakhir klik tombol Finish.


Setelah proses instalasi selesai di komputer Anda akan terdapat sebuah folder OpenAL 1.1 SDK seperti yang tampak di bawah ini.


Periksalah di folder C:\WINDOWS\system32 apakah telah terdapat file OpenAL32.dll. Jika proses instalasi berhasil dengan sukses seharusnya file ini akan ada di folder tersebut (ogut menggunakan Windows 7 Ultimate SP1, untuk versi Windows yang lain Anda harus menyesuaikan folder yang dimaksud). Jika tidak ditemukan jalankan file OpenALwEAX.EXE yang ada pada folder OpenAL 1.1 SDK\redist.


Instalasi ALUT 1.1
Disamping OpenAL kita memerlukan satu API lain untuk melengkapi OpenAL 1.1 yang kita pasang sebelumnya. Berikut cara instalasi alut versi 1.1 di komputer Anda.

Copy file alut.dll yang ada pada folder freealut-1.1.0-bin\lib ke folder C:\WINDOWS\ system32.



First OpenAL
Setelah Anda selesai dengan proses instalasi saatnya kita belajar cara membuat program dengan OpenAL.

Program OpenAL yang akan kita bahas adalah program yang harus menyatu dengan program OpenGL. Dan untuk membuat program OpenAL di dalam program OpenGL tidaklah rumit.

Pertama tambahkan include dan link library untuk OpenAL.

...
...
...
//++++++++++++++++++++ //include untuk OpenAL
//++++++++++++++++++++ #include "al/alut.h"
...
...
...
//+++++++++++++++++++++++++
//link library untuk OpenAL
//+++++++++++++++++++++++++
#pragma comment(lib, "my_codes/AL/alut.lib")
#pragma comment(lib, "my_codes/AL/openal32.lib")
...
...
...

Langkah kedua kita harus setup OpenAL dengan fungsi di bawah ini.

bool Setup_OpenAL()
{
ALCcontext *My_ALCcontext;
ALCdevice *My_ALCdevice;

if ((My_ALCdevice = alcOpenDevice(NULL)) == NULL)
{
MessageBox(NULL,
"Failed to Initialize OpenAL !!!",
"OpenAL ALCdevice Error",MB_OK);
return false;
}

if ((My_ALCcontext = alcCreateContext(My_ALCdevice,NULL)) == NULL)
{
MessageBox(NULL,
"Failed to Create ALCcontext !!!",
"OpenAL ALCcontext Error",MB_OK);
return false;
}

alcGetError(My_ALCdevice);
alcMakeContextCurrent(My_ALCcontext);
if (alcGetError(My_ALCdevice) != ALC_NO_ERROR)
{
MessageBox(NULL,
"Failed to Make Current ALCcontext!!!",
"OpenAL ALCcontext Error",MB_OK);
return false;
}

alGetError();
alcGetError(My_ALCdevice);

return true;
}

Langkah berikutnya load file suara wave.

unsigned int CreateGameSound(char *WaveFilename_p, bool PlayRepeat_p)
{
ALint My_Error;
ALsizei My_Size;
ALsizei My_Freq;
ALenum My_Format;
ALvoid *My_Data;
ALboolean My_Loop;

unsigned int My_WaveSource;
unsigned int My_WaveBuffer;

alGenBuffers(1, &My_WaveBuffer);
if ((My_Error=alGetError()) != AL_NO_ERROR)
{
MessageBox(NULL,
WaveFilename_p,
"OpenAL Generate Buffer Error",
MB_OK);
return NULL;
}

alutLoadWAVFile(WaveFilename_p, &My_Format, &My_Data, &My_Size, &My_Freq, &My_Loop);

if ((My_Error=alGetError()) != AL_NO_ERROR)
{
MessageBox(NULL,
WaveFilename_p,
"OpenAL Load Wave File Error",
MB_OK);
return NULL;
}

alBufferData(My_WaveBuffer, My_Format, My_Data,My_Size,My_Freq);

if ((My_Error=alGetError())!= AL_NO_ERROR)
{
MessageBox(NULL,
WaveFilename_p,
"OpenAL Buffer Error",MB_OK);
return NULL;
}

alutUnloadWAV(My_Format, My_Data, My_Size, My_Freq);

if ((My_Error=alGetError())!=AL_NO_ERROR)
{
MessageBox(NULL,
WaveFilename_p,
"OpenAL Unload Wave File Error",
MB_OK);
return NULL;
}

// Create Source
alGetError();
alGenSources(1, &My_WaveSource);
alSourcei(My_WaveSource, AL_BUFFER, My_WaveBuffer);

//set sound yang dimainkan secara berulang
if (PlayRepeat_p)
alSourcei(My_WaveSource, AL_LOOPING, AL_TRUE);


return My_WaveSource;
}

Setelah file wave berhasil di load, Anda dapat memakai fungsi alSourcePlay() dan alSourceStop() untuk memainkan dan menghentikan suara yang dibuat dari file wave.

Dan jika program OpenGL akan dihentikan, buffer suara yang kita buat sebelumnya untuk OpenAL sebaiknya dihapus dan tutup OpenAL dengan fungsi-fungsi sebagai berikut

void Destroy_Wave_Buffer(unsigned int buffer_p[], int total_sound_p)
{
int i;

for (i = 0 ; i < total_sound_p; i++)
alDeleteBuffers(1, &buffer_p[i]); 
}

void Destroy_OpenAL()
{
ALCcontext *My_ALCcontext;
ALCdevice *My_ALCdevice;
My_ALCcontext=alcGetCurrentContext();

My_ALCdevice=alcGetContextsDevice(My_ALCcontext);

alcMakeContextCurrent(NULL);
alcDestroyContext(My_ALCcontext);
alcCloseDevice(My_ALCdevice);
}

Ok rekan-rekan sekalian selesai sudah pembahasan tentang OpenAL, program ini sebagai pembanding dengan program direct sound yang pernah ogut bahas sebelumnya. Sampai ketemu lagi di artikel berikutnya.

Salam Game Maker


Heriady
heriady.yoh@gmail.com



Artikel terkait

Membuat Game Engine Sendiri dengan Visual C++

Membuat Game Shoot Them Up dengan Visual C++

Contoh Program Direct Sound (Suara Untuk Program Game)