14/06/2003
27/04/2010
Şuana kadar tüm gerçek incelik isteyen şeylerin
yapılmasını Alut'a bıraktık. Örneğin, ses aygıtlarının
yönetimi. Alut
kütüphanesinin bu fonksiyonellliği sağlamak üzere burada olması gerçekten
güzel ama herhangi akıllı programcı tam olarak onun ne yaptığını bilmek isteyecektir.
Bize birkaç durumda direkt Alc'i kullanmayı isteyebiliriz. Velhasıl bu derste, Alc katmanına
ışık tutup kendi başımıza aygıtları nasıl yöneteceğimize
göz atacağız.
ALCdevice* pDevice;
ALCubyte DeviceName[] =
"DirectSound3D";
pDevice = alcOpenDevice(DeviceName);
Peki, bir Alc aygıtı nedir? Bir resouce olarak onu düşünmeye
çalış. OpenAL, kullanılacak aygıta tüm sistemce dönüşümlü
paylaşılan handle elde eder. Bir aygıt, ses aygıtı olarak DirectSound'u
kullandığımız bu olayda olduğu gibi özel bir
yazılımsal aygıt olabilir. Bu yazılım, fiziki aygıta bir handle elde eder ve uygulama tarafından
onun kullanılmasını hazırlar. Velhasıl özel ses kartları
için yapılmış birçok fiziki aygıtı
kullanabiliriz.
'alcOpenDevice'
'e NULL geçmek, tamamen
geçerli bir
argümandır. O Alc'e varsayılan aygıtı kullanmaya iter.
ALCcontext* pContext;
pContext = alcCreateContext(pDevice,
NULL);
alcMakeContextCurrent(pContext);
Bir
Alc context'i nedir? OpenGL
programcılarına, farklı pencereler arası state(durum) yönetimini
kontrol ettiren OpenGL tarafından
kullanılan render context'lerini
çağrıştırabilir. İsimlendirildiği gibi 'HGLRC' ,
çoklu
renderleme
pencerelerini etkinleştirmek üzere birkaç kez yaratılabilir . Ve her context için farklı
renderleme
stateleri elde edilebilir. Bir Alc contextde aynı esasla çalışır. İlkin kullanacağımız aygıtı ona söyleriz (önceden
yarattığımız), sonra bu context'i aktif geçerli yaparız. Teoride farklı
pencereler için çoklu renderleme contextlerini yaratabilip farklı state değişkenleri
set
edilebilir
ki oldukça da güzel olur. "Renderleme(sahneleme) contexti" terimi genellikle
görsel bir şeye özgül kullanılmasına rağmen, Sdk dokümanlarında kullanılan bir
terimdir ve
kullanılan
terimde olmalıydı.
'alcCreateContext''de
ikinci parametrenin NULL olarak set edildiğini de fark etmişinizdir. Creative Labs OpenAL
sdk’da, bu parametreye opsiyonel flaglar olarak devamdaki değerler
tanımlanmıştır.
- ALC_FREQUENCY
- ALC_REFRESH
- ALC_SYNC
Eğer
çoklu context yaratırsanız birbiri arası değişimi 'alcMakeContextCurrent
çağrısıyla yapabilirsiniz. 'alcMakeContextCurrent' 'de NULL yollamak yine tamamen geçerli bir argümandır. Bu, herhangi bir ses
datasının işlenmesini engelleyecektir. Haberiniz olsun, çoklu contextlere sahip olsanız bile aynı anda
sadece bir
tanesi aktif geçerli olabilir. Ve uygulamanızın
dönüşümlü iki context kullanmaya ihtiyaç duyduğu zaman aktif geçerli contextin uygunluğundan emin
olacak kişi siz
olacaksınız. Önemli kontrollerden geçirmeden aktif geçerli
contexti doğruluğuna karar verme zamanların olacaktır.
ALcontext* pCurContext;
pCurContext = alcGetCurrentContext();
Contextinize sahip olduğunuz andan itibaren aynı zamanda bu context ile kullanılan aygıtı elde edebilirsin.
ALdevice* pCurDevice;
pCurDevice = alcGetContextsDevice(pCurContext);
Yukarıda,
hangi aygıtı
kullandığını bulmak için elde ettiğimiz context’i kullandık. Aynı zamanda Alc 'de contextleri yönetmek için başka bir harika özellik
vardır.
alcSuspendContext(pContext);
// pContext’de işlemi durdur.
alcProcessContext(pContext);
// pContext’de işlemi tekrar
aktif et.
Yukarıda
yaptığımız, contextdeki ses datasının işlenmesini durdurup sonra devam ettirmektir. İşleme
durdurulduğunda, bu contextde yollanan datadan üretilen ses olmayacaktır. Renderleme contexti
hakkında
başka bir not: OpenAL 1.0 spesifikasyonunun ima ettiği ama açıkça
söylenmemiş olan; sourceler ve bufferlar, contextler arasında kullanılabilir. Bir source veya buffer "ömrü", source ve buffer ID’leri geçerli (silinmemişseler) olduğu sürece
uygulamanın ömrüncedir.
alcMakeContextCurrent(NULL);
alcDestroyContext(pContext);
alcCloseDevice(pDevice);
Ve
bu üstekiler düzeltmeler içindir. NULL ile aktif
geçerli contexte varsayılan getirilir, yarattığımız context serbest
bırakılır, ve aygıt handleyi sistem kaynaklarına geri verilir. Şuana kadar anlatmadığımız birkaç Alc
fonksiyonu daha var.
ALenum alcGetError(ALvoid);
ALboolean
alcIsExtensionPresent(ALCdevice* device, ALubyte* extName);
ALvoid* alcGetProcAddress(ALCdevice*
device, ALubyte* funcName);
ALenum alcGetEnumValue(ALCdevice*
device, ALubyte* enumName);
ALubyte* alcGetString(ALCdevice* device,
ALenum token);
ALvoid alcGetIntegerv(ALCdevice* device,
ALenum token, ALsizei size, ALint* dest);
Bunların,
ne yaptığı size hayli açık olabilir, ama kendimiz eyleyip
yakından bakacağız. İlki 'alcGetError' , aynen 'alGetError' gibidir ama tabi Alc
hatalarını döndürür. Sonraki üç fonksiyon Alc eklentilerini sorgulamak
içindir. Hiç Alc eklentisi olmamasına rağmen
geliştiricinin tamamen gelecek planları içindir. Son fonksiyon,
'alcGetInteger', 'ALC_MAJOR_VERSION' veya 'ALC_MINOR_VERSION' geçildiğinde Alc versiyonunu
döndürür.
'alcGetString' fonksiyonu oldukça mükemmeldir.
Parametre olarak devamdaki sabitlerden herhangi birini alabilir:
- ALC_DEFAULT_DEVICE_SPECIFIER
- ALC_DEVICE_SPECIFIER
- ALC_EXTENSIONS
İlki,
OpenAL uygulamanızın kullanmasını istediğiniz aygıt stringini
döndürür. Mevcut OpenAL'de bu, yukarda kullandığımız gibi
"DirectSound3D" olacak. İkincisi, belirteçler listesini
döndürür, Ama mevcut OpenAL'de
sadece, "DirectSound" döner (bazı nedenlerden dolayı "3D"
olmadan). Sonuncusu, şu an
olmayan ,
Alc eklentilerinin listesini
döndürür.
Velhasıl
sizin
için
Alc'nin enleri bunlar. OpenAL'in işletim sistemiyle nasıl
etkileştiğinin net anlaşıldığını umuyorum. Kendi ilkleme rutinlerinizi yazmayı
deneyebilir
böylece
tamamen Alut'dan kurtulabilirsiniz. Her iki yöntemle iyi
eğlenceler.
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/lesson4.php
Dersin Orjinali : http://www.devmaster.net/articles/openal-tutorials/lesson4.php