14/06/2003
25/04/2010
Umarım son dersten biraz fayda
sağlamışınızdır. Ben de öyle
düşündüm. Bu, gerçekten kolay ve kısa bir ders
olacak. Şu nokta da çok fazla komplike gelmeyecek.
#include <conio.h>
#include <time.h>
#include <stdlib.h>
#include <al/al.h>
#include <al/alc.h>
#include <al/alu.h>
#include <al/alut.c>
// Bufferlar ses datasını tutar.
ALuint Buffer;
// Sourceler sesin yayılma noktalarıdır.
ALuint Source;
// Source’nin pozisyonu.
ALfloat SourcePos[] = { 0.0, 0.0, 0.0 };
// source’nin hızı.
ALfloat SourceVel[] = { 0.0, 0.0, 0.1 };
// listener’nın pozisyonu.
ALfloat ListenerPos[] = { 0.0, 0.0, 0.0 };
// listener’nın hızı.
ALfloat ListenerVel[] = { 0.0, 0.0, 0.0 };
// listener’nın yönü. (ilk 3 eleman "-de,-da", ikinci 3lü "üs")
ALfloat ListenerOri[] = { 0.0, 0.0, -1.0, 0.0, 1.0, 0.0 };
Bu ilk kısımda son dersteki koddan sadece tek
değişiklik var. Source’nin hızını
değiştirdik. Şimdi 'z' kısmı 0.1.
ALboolean LoadALData()
{
// alutLoadWavFile çağrısı sonrası otomatik dolacak değişkenler.
ALenum format;
ALsizei size;
ALvoid* data;
ALsizei freq;
ALboolean loop;
// Buffer’a wav datasını yükle.
alGenBuffers(1, &Buffer);
if (alGetError() != AL_NO_ERROR)
return AL_FALSE;
alutLoadWAVFile("wavdata/Footsteps.wav", &format, &data, &size, &freq, &loop);
alBufferData(Buffer, format, data, size, freq);
alutUnloadWAV(format, data, size, freq);
// Source ile buffer’ı bağla.
alGenSources(1, &Source);
if (alGetError() != AL_NO_ERROR)
return AL_FALSE;
alSourcei (Source, AL_BUFFER, Buffer );
alSourcef (Source, AL_PITCH, 1.0f );
alSourcef (Source, AL_GAIN, 1.0f );
alSourcefv(Source, AL_POSITION, SourcePos);
alSourcefv(Source, AL_VELOCITY, SourceVel);
alSourcei (Source, AL_LOOPING, AL_TRUE );
// Hata kontrolü yap ve dön.
if (alGetError() != AL_NO_ERROR)
return AL_FALSE;
return AL_TRUE;
}
Bu kısımda iki farklılık
var. İlki "Footsteps.wav" dosyasını
yüklüyoruz. Ve de source’nin 'AL_LOOPING' değerine
'AL_TRUE'’i set ediyoruz. Bu, durdurulana kadar tekrar tekrar
çalmayı sağlar. Ses klipi bitince tekrar baştan çalmaya
başlar.
void SetListenerValues()
{
alListenerfv(AL_POSITION, ListenerPos);
alListenerfv(AL_VELOCITY, ListenerVel);
alListenerfv(AL_ORIENTATION, ListenerOri);
}
void KillALData()
{
alDeleteBuffers(1, &Buffer);
alDeleteSources(1, &Source);
alutExit();
}
Burada hiçbir değişiklik yok.
int main(int argc, char *argv[])
{
// OpenAL’i ilkle ve hata bitini resetle.
alutInit(NULL,0);
alGetError();
// wav datasını yükle.
if (LoadALData() == AL_FALSE)
return 0;
SetListenerValues();
// bir çıkış prosedürü kur.
atexit(KillALData);
// Source ‘ü çalmaya başla.
alSourcePlay(Source);
// Döngü
ALint time = 0;
ALint elapse = 0;
while (!kbhit())
{
elapse += clock() - time;
time += elapse;
if (elapse > 50)
{
elapse = 0;
SourcePos[0] += SourceVel[0];
SourcePos[1] += SourceVel[1];
SourcePos[2] += SourceVel[2];
alSourcefv(Source, AL_POSITION, SourcePos);
}
}
return 0;
}
Bu kodda değişen tek şey döngüdür.
Ses dosyası çalıp bitmek yerine , Source ’nin
pozisyonunu daha uzaklaştırarak yavaşça sessizlik
sağlanacak. Zaman fazlı, pozisyonu, hızı kadar
yavaşça arttırarak bunu yapıyoruz. Zaman, sistem saatiyle
bizim verdiğimiz periyodu kontrolü deniyor. Bu periyodu
değiştirmek ister misiniz bilmem ama eğer klibin sesinin daha
hızlı kaybolmasını istiyorsanız 50 ‘den daha
büyük bir sayı kullanılmalı. Herhangi tuşa
basılma döngüyü sonlayacaktır.
Dev-C++
proje ve kaynak dosyalarını yükle
Visual C++ 6.0 proje ve kaynak dosyalarını yükle - (TheCell tarafından port edilmiştir)
Java kaynak kodlarını yükle - (Athomas Goldberg tarafından port edilmiştir)
Bu dersin Linux portunu yükle - (Lee Trager tarafından port edilmiştir)
Bu dersin MacOS portunu yükle - (Joshua Schrier tarafından port edilmiştir)
Visual C++ 6.0 proje ve kaynak dosyalarını yükle - (TheCell tarafından port edilmiştir)
Java kaynak kodlarını yükle - (Athomas Goldberg tarafından port edilmiştir)
Bu dersin Linux portunu yükle - (Lee Trager tarafından port edilmiştir)
Bu dersin MacOS portunu yükle - (Joshua Schrier tarafından port edilmiştir)
*Bu dersin Java versiyonu için Java Bindings for OpenAL sayfasına bakın (Athomas Goldberg tarafından adapte edilmiştir)
Dersin Orjinali : http://www.devmaster.net/articles/openal-tutorials/lesson2.php