DirectX Direct.Sound Kütüphanesi
Bu makalemizde DirectX içerisinde olan Direct.Sound kütüphanesi incelemeye çalışacağız. DirectX içerisinde bulunan diğer kütüphaneler gibi Direct.Sound kütüphanesi çok gelişmiş ve içerisinde kendine has sınıflar, yapılar, hatalar bulunan bir kütüphanedir. Bu makale ile anlatacağım Direct.Sound kütüphanesini elimden geldiğince size tanıtmaya çalışacağım. Kütüphaneyi ayrıntılı olarak inceledikten sonra bir küçük uygulama ile (bir ses dosyasını çalmak ) bu bilgileri kısmende olsa uygulayacağız.
Ses Teknolojisi
2000'li yıllardan önce ses kartları ve ses cihazları bugünlerdeki gibi popüler değildi. Fakat hızlı bir biçimde teknoloji geliştikçe ses kartları ve özellikleri gittikçe önem kazanmaya başladı. 2000'li yıllardan beri multimedia sistemler yaygınlaşmakta ve ses kartları ve ses aygıtları bu paralelde gelişmektedir. Ses aygıtları bilgisayarın dışarıya ses vermesi ya da dışarıdan ses alıp bilgisayara ilgili veriyi ileten aygıtlardır. Ses ortamdaki basınç değişimi ile ortaya çıkar. Ses kartları ortamdaki basınç değişimlerini algılayarak bu değişimleri sayısal veriye çevirir(ses kaydı) ya da hoparlör yardımıyla dış ortama bilgisayarın içerisindeki sayısal veriyi alarak analog veri haline getirir ve bunu yaparken yine basınçtan yararlanır. Ses kartı üzerinde verileri almak için birden fazla yöntem kullanılır (sampling, synthesis, wavetable) ve bu alınan veriler işlenerek birçok formatta kayıt yapılabilir. Alınan sesin üzerinde filtreleme ya da gürültülerin giderilmesi için ise bir çok yapı vardır. Ses verilerinin büyüklüklerini ayarlamak içinde değişik sıkıştırma algoritmaları (Digital Signal Processor) kullanılmaktadır.Ses kartları 8 bit,16 bit ve 32 bit gibi örnekleme özelliğine sahiptirler bit sayısı artarak sesin kalitesi ve ses dosyasının boyutu artmaktadır. İnsan kulağı gerçekte sesleri her yönde ve doğrultuda algılayabilmektedir. Bilgisayar ortamında bu türlü bir ses oluşturmaya ya da bu tür bir ses yapısına üç boyutlu ses denir. 3D ses sisteminde yukarıdan, aşağıdan, arkadan, ileriden gelen sesler mesafe ayırımı ile hissedilebilir. Stereo ses ise en az iki hoparlör kullanılarak yapılan ses tipidir. Bu ses tipinde bas ve tiz farklı hopörlerlerden verilerek akustik ses(stereo) oluşturulabilmektedir. Surround ses ise Dolby Sound,Dolby Digital (AC-3) ve DTS olmak formatlarıdır. Bu yapılar ikiden fazla kanal içermekte ve sese değişik etkiler katmaktadır. Bu yapılardan farklı olarak Surround, EAX , A3D ,Sensaura, Q3D ,I3DL2 HRTF ve Direct Sound 3D standartları vardır. Direct Sound 3D, oyunlarda doğrudan bilgisayar donanımını adreslemesini sağlayan DirectX'in bir yapısıdır.Oyun programcıları DS3D kullanarak oyunlarındaki ses kaynaklarının ve kullanıcının konumlarını x,y ve z koordinatlarında belirlerler. Kullanıcının oyunda ne yöne baktığı,ses kaynaklarının hızları,sesin yayılma yöntemi gibi faktörler de programcılar tarafından tanımlanabilir.
Direct.Sound kütüphanesi içerisinde programcıların kullanabileceği ve yakalayabileceği hatalar aşağıdaki gibidir.
Direct.Sound Exception'lar
SoundException AccessDeniedException AllocatedException BadFormatException BadSendBufferGuidException BufferLostException BufferTooSmallException ControlUnavailableException EffectsUnavailableException InvalidCallException NoAggregationException NoDriverException ObjectNotFoundException OtherApplicationHasPriorityException PriorityLevelNeededException SendLoopException UnsupportedException
SoundException DirectXException'dan türer ve DirectSound exceptionlarına miraslık yapar. Tüm DirectSound exceptionlar miras olarak SoundException alır. AccessDeniedException ses aygıtına erişim engellendiğinde fırlatılır, AllocatedException ses aygıtı başka bir yapı tarafından kullanılıyorsa ve bu yapının aygıtı kullanım önceliği(Priority Level)'i sizin isteğinizden daha yüksekse fırlatılır, BadFormatException ses aygıtının okuması ya da vermesi gereken (DAC(Sayısal Analog Çevirisi) ve ADC(Analog Sayısal Çevirici) içerisinde) formatın uygun olmaması durumunda fırlatılır.BadSendBufferGuidException buffera gönderilecek ses dosyası uygun formatta değilse fırlatılır. BufferLostException bellekte tutulan buffer alanının kaybolması durumunda fırlatılır. BufferTooSmallException yapılan işlem için kullanılan buffer alanının yeterli büyüklükte olmaması durumunda fırlatılır. ControlUnavailableException, buffer yaratılmadan buffer üzerinde yapılacak kontrollerin(ses şiddeti, kanalı, formatı) tanımlanması gerekmektedir eğer ilgili kontrol tanımlanmayıp ilgili kontrol ile bir işlem yapılmak istenirse bu hata fırlatılır. EffectsUnavailableException yapılmak istenen etki sistem üzerinde tanımlı olmadığında, yanlış sırada ya da yanlış biçimde olduğunda oluşur. Örnek olarak donanımsal olarak beklenen bir etkinin yazılımsal olarak yapılmak istenmesinde fırlatılır. InvalidCallException istenilen fonksiyonun şu an kullanılmasının uygun olmadığı durumlarda fırlatılır. NoAggregationException ses nesnenin başka ses nesneleri ile birleştirilmeyeceğini(mix) belirten hatadır. NoDriverException verilen Id numarası ile kullanılabilir ses aygıtın olmaması durumunda fırlatılır. ObjectNotFoundException istenilen nesne şu an bulunamıyorsa fırlatılır.OtherApplicationHasPriorityException aygıta sizin isteğinizden daha üst seviyeli bir istek geldiğinde sizin aygıt erişiminiz engellenir bu durumda hata fırlatılır, SendLoopException ses dosyası üzerinde devresel döngü tespit edildiğinde fırlatılır en son olarak UnsupportedException ilgili nesnenin fonksiyonunu çağırmak şu an mümkün değilse fırlatılır.
Direct.Sound Enumeration'lar
BufferDescriptionFlags: Buffer kapasitesini tanımlamak için kullanılan bayraklardır. Aşağıdaki değerleri alırlar .
BufferSize:Minimum ve maksimum buffer büyüklüğü tutulduğu enum'dur.
CaptureEffectsReturnValue: Ses kayıt bufferının etki parametrelerini kapsar.
CooperativeLevel: Çeşitli yetki seviyelerini belirtir.
EffectsEnvironmentPreset: Efek özelliklerini belirtir.
EffectsReturnValue: Efek dönüşü özelliklerini belirler.
EffectStatus: Efek durumlarını belirler.
Frequency Frekans değerlerini belirler.
LockFlag: Buffer kilitleme bayrakları
Mode3D: Üç boyutlu ses işlemleri için kullanılır.
OperationMode: Operasyon modları için kullanılır
Pan: Kanal boylarını(sağ-sol) ayarlamaya yarar.
PositionNotifyFlag: Belli bir nokta üzerinde uyarı vermesi sağlanması için kullanılır.
Volume: Ses şiddetini ayarlamaya sağlar.
WaveFormatTag:Dalga formatı
BufferPlayFlags:Buffer karakteristiklerini tanımlamak için kullanılan bayraklardır.
Direct.Sound Yapılar
Angles
Açılar.
Buffer3DSettings
Üç boyutlu ses yapabilmek için gerekli olan yer, hareket ve yönlenme bilgilerini kapsar.
BufferCaps
DirectSound buffer nesnesinin kapasitelerini tanımlar
BufferPositionNotify
Bildirim pozisyonlarını belirtir.
BufferStatus
Buffer durumlarını belirtir
Caps
Aygıt kapasitesini tanımlar
CaptureBufferCaps
Ses kaydı bufferinin büyüklük kapasitesini belirler.
CaptureBufferDescription
Ses kayıt buffer bilgilerini belirtir
CaptureCaps
Ses kayıt aygıtının kapasitesini belirtir.
CaptureEffectDescription
Ses kayıt bufferının etki parametrelerini kapsar.
CaptureEffectsAcousticEchoCancellation
Akustik yankı iptaline kayıt bufferının alacağı parametleri alır.
CaptureEffectsNoiseSuppress
Ses kaydı sırasında gürültü bastırılma parametlerini alır.
DeviceInformation
Ses aygıtı ile ilgili bilgileri içerir.
EffectDescription
Buffera verilecek ses efekti özelliklerini tanımlar
EffectsChorus
Koro efekti özelliklerini içerir.
EffectsCompressor
Sıkıştırma efektlerini kapsar
EffectsDistortion
Distortion efektlerini içerir
EffectsEcho
Yankı etkisi parametrelerini kapsar
EffectsFlanger
Bir ses dalgasinin kopyasinin, orjinaliyle gorece kucuk bir zaman farki(milisaniye cinsinden) olusturacak sekilde mikslenmesi sonucu yaratilan bir etkinin yapılabilmesi için gereken parametlereleri içerir.
EffectsGargle
Ses üzerinde genlik modülasyon parametlerini içerir
EffectsInteractive3DLevel2Reverb
I3DL2 (Interactive 3D Audio Level 2) efekti sağlar
EffectsParamEq
Equalizer etkisi yapmak için gerekli uygun parametleri içerir.
EffectsWavesReverb
Ses dalgalarının yankılanma efektinin verilmesi için uygun parametreleri içerir.
Listener3DOrientation
Üç boyutlu ses etkisi vermek için ses yönünü belirlemeyebilmek için gerekli parametreleri içerir
Listener3DSettings
Üç boyutlu ses düzeninde ayarlamaları içerir
Speakers
Hoparlör ayarlamalarını içerir.
WaveFormat
Ses datasının dalga formatlarını tanımlar
Direct.Sound Sınıflar
Buffer
Ses buffer'ını yönetmek için kullanılır.
Buffer3D
Üç boyutlu buffer uzayını belirtmek için kullanılır, buffer koordinat,çevre ve yönlenme ile tanımlanır.
BufferDescription
Yeni bir buffer nesnesinin karakteristik özelliklerinin tanımlanmasında kullanılır.
Capture
Ses kaydının yapılıp buffer'a alınması işlemini yönetir.
CaptureAcousticEchoCancellationEffect
Akustik yankı etkisi hata durumuna düştüğünde gerekli parametreleri almak ve vermek için kullanılır. Kullanılabilmesi için en az Microsoft Windows Xp ve daha sonrası işletim istemleri gerekmektedir.
CaptureBuffer
Ses kayıdı yapılabilmesi ve bu kaydın üzerinde değişiklik yapılabilmesi için kullanılan bufferdır.
CaptureDevicesCollection
Ses kayıt cihazlarının koleksiyonudur.
CaptureNoiseSuppressEffect
Ses kayıdı sırasında oluşan gürültünün(istenmeyen ve değer niteliği olmayan) önlenmesi için alınan ve verilen parametler için kullanılır.Kullanılabilmesi için en az Microsoft Windows Xp ve daha sonrası işletim istemleri gerekmektedir.
ChorusEffect
Sesin koro(çok seslilik) etkisi sağlamak için kullanılır.
CompressorEffect
Buffer'ın sıkıştırılması için verilmesi ya da alınması gereken parametreleri içerir.
Device
Buffer nesnesini yaratır, aygıtları yönetir ve çevreyi sağlar.
DevicesCollection
Aygıtlar kolleksiyonunu içerir
DistortionEffect
Sinyalin içinde bulunduğu manyetik alandan kaynaklanan bozulmaya,radyolarda duyulan cızırtıları yönetmek için kullanılır.
DSoundHelper
DirectSound nesnesinin yardımcısıdır.
EchoEffect
Yankı destekli bufferların yankı özelliklerini ayarlamak için kullanılır.
FlangerEffect
IDirectSoundFXFlanger8 nesnesi kullanarak flange(bir ses dalgasinin kopyasinin, orjinaliyle gorece kucuk bir zaman farki(milisaniye cinsinden) olusturacak sekilde mikslenmesi sonucu yaratilan etki) etkisi yapar.
FullDuplex
FullDuplex stream sağlar.
GargleEffect
Ses üzerinde genlik modülasyonları üzerinde oynama yaparak etki yapar.
Interactive3DLevel2ReverbEffect
I3DL2 (Interactive 3D Audio Level 2) efekti yapar.
Listener3D
Üç boyutle ses düzeninde dinleyicilerin pozisyonunu, yönünü hareketini belirlenmesini sağlar.
Notify
Uyarı işlemlerini kapsar
ParamEqEffect
Ekolayzır parametrelerini belirlemek için kullanılır.
SecondaryBuffer
Ses bufferının yönetilmesi için kullanılır.
Ses Dosyasını DirectX ve Direct.Sound ile çalınması
Önceki makalelerimde anlattığım gibi DirectX projesi oluşturduktan sonra Microsoft.DirectX.DirectSound kütüphanesini projemize eklememiz gerekmektedir.
Yazdığımız DirectX formunda Escape tuşuna baştığımız ilgili dosyayı çalıştıracağız. DirectX DirectSound kütüphanesi wav uzantılı dosyaları otomatik olarak çalabilir. İlgili wav dosyasını program çıktısı ile aynı klasöre koymamız gerekmektedir. Yazılım üzerinde open file dialog ile dosyanın seçilmesini ve seçilen dosyanın çalıştırılmasını siz yapabilirsiniz. Aşağıda escape tuşunun yakalanmasını gösterilmiştir..
protected
{
}
Ses dosyasının çalınabilmesi için bufferımızı oluşturup ses kartı için aygıtımızı oluşturmalıyız.Ses çıkışı için iki tane buffer gerekmektedir. Primary buffer direk aygıta gönderilen stream'ı tutar, ikinci buffer ise ses üzerinde işlemler yaparak birincil buffer için streamı hazırlar. Tüm işlemler ikincil buffer üzerinde yapılır.Kod üzerinde görüldüğü gibi wav dosyası ikincil buffer üzerinde tanımlanmaktadır. Daha sonra tanımlanan ikincil buffer aygıt üzerinden Applicationbuffera verilmektedir. Birincil buffer play özelliğini kulanarak ses dosyasını çalmaktadır.Play fonksiyonu ses kartının numarasını göstermektedir. Bilgisayarın üzerinde birden fazla ses kartı varsa ilgili ses kartı Id si yazılmalıdır. Fonksiyonun ikinci parametresi ise ses çalma işleminin nasıl olacağıdır. Biz normal olarak sesin birkez çalmasını istediğimiz için BufferPlayFlags enumunu kullanarak default olarak verdik. Programın kaynak kodlarını eklenti olarak makaleye koyacağım indirip daha ayrıntılı olarak inceleyebilirsiniz.
private SecondaryBuffer ApplicationBuffer = null;
private Microsoft.DirectX.DirectSound.Device ApplicationDevice = null;
public
Mehmet Ali ECER
www.mehmetaliecer.com