Arama Motoru

OpenAL Ders 4: ALC

OpenAL Ders 4: ALC
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 ı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