Arama Motoru

OpenAL Ders 2: Döngüleme ve Yavaşça Sesin Kaybolması

OpenAL Ders 2: Döngülemek ve Fadeaway

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.


*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