Makale Özeti

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.

Makale

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 .

LocateInHardware 4 Buffer donanımsal olarak tutulacaktır
LocateInSoftware 8 Buffer yazılımsal olarak bellekte tutulur.
StickyFocus 16384 Buffer sticky focus olarak tutulur, yani başka bir uygulama buffer ı kullanacaksa uygulamanın bufferını kullanamaz, ilgili uygulama işlemini tamamladıktan sonra buffer yine kullanılmaya başlanır..
StaticBuffer 2 Eğer bellekte yeterli yer yoksa hiçbir hata verilmemesini sağlar.
PrimaryBuffer 1 Buffer birincildir ve kontrol etkileri ile üzerinde değişiklik yapılamaz.
Mute3DAtMaximumDistance 131072 Ses mümkün olan en hızlı şekilde kesilir.Sadece yazılımsal buffer kullanımda geçerlidir.
GlobalFocus 32768 Buffer ses için global olarak tanımlanır. Bu buffer tüm uygulamalar tarafından kullanılır.
CanGetCurrentPosition 65536 Bufferda tam olarak istenilen pozisyona getirilebilir.
ControlVolume 128 Ses şiddeti büyüklüğü kontrol edilebilir.
ControlPositionNotify 256 Buffer üzerinde istenilen pozisyona geldiğinde uyarı verdilebilir.
ControlPan 64 Buffer üzerinde pan kontrolü yapılabilir
ControlEffects 512 Buffer üzerinde efek kontrolleri çalışabilir.
ControlFrequency 32 Buffer frekans bilgileri üzerinde kontrol sağlanabilir..
Control3D 16 Buffer üzerinde 3D kontroller çalıştırılabilir.
DeferLocation 262144 Buffer çalma zamanında yazılımsal mı donanımsal mı tutulacağını belirtir.

 

 

 

 

 

 

 

 

 

 

    BufferSize:Minimum ve maksimum buffer büyüklüğü tutulduğu enum'dur.

EffectsMin 150 Buffer üzerinde kullanılan efeklerin minimum süresidir(milisaniye)
Max 268435455 Bufferın bytes olarak maksimum büyüklüğüdür.
Min 4 Bufferın bytes olarak minimum büyüklüğüdür.

    CaptureEffectsReturnValue: Ses kayıt bufferının etki parametrelerini kapsar.

LocatedInSoftware 32 Efek etkisi yazılım üzerindedir..
LocatedInHardware 16 Efek etkisi donanım üzerindedir.

    CooperativeLevel: Çeşitli yetki seviyelerini belirtir.

Normal 1 Normal yetki seviyesidir. Multitasking ve paylaşımsal kaynak yönetiminde en düşük seviyededir.
Priority 2 Priority level seviyesidir.
WritePrimary 4 Yazma öncelikli seviyesidir.

    EffectsEnvironmentPreset: Efek özelliklerini belirtir.

Plate 29 Plak özelliğini sağlar
LargeHall 28 Büyük bir mekan, alan  ses yankı özelliği sağlar.
MediumHall 27 Orta büyüklükte bir mekan, alan ses yankı özelliğini sağlar
LargeRoom 26 Geniş büyüklükte oda ses yankı özelliğini sağlar..
MediumRoom 25 Orta büyüklükte oda ses yankı özelliğini sağlar.
SmallRoom 24 Küçük büyüklükte oda ses yankı özelliğini sağlar.
UnderWater 23 Su altı yankı özelliğini sağlar.
SewerPipe 22 Kanal yankı özelliğini sağlar.
ParkingLot 21 Araba park yeri yankı özelliğini sağlar.
Plain 20 Düz ses özelliğini sağlar.
Quarry 19 Maden yankı özellini sağlar
Mountains 18 Dağ yankı özelliğini sağlar.
City 17 Kent yankı özelliğini sağlar
Forest 16 Orman yankı özelliğini sağlar.
Alley 15 Patika yankı özelliğini sağlar
StoneCorridor 14 Taş koridor yankı özelliğini sağlar
Hallway 13 Koridor yankı özelliğini sağlar
CarpetedHallway 12 Halı ile kaplı yankı özelliğini sağlar
Hangar 11 Hangar yankı özelliğini sağlar
Arena 10 Arena yankı özelliğini sağlar
Cave 9 Mağara yankı özelliğini sağlar
ConcertHall 8 Konser salonu yankı özelliğini sağlar
Auditorium 7 Toplantı salonu yankı özelliğini sağlar
StoneRoom 6 Taş oda.yankı özelliğini sağlar
Livingroom 5 Oturma odası yankı özelliğini sağlar
Bathroom 4 Banyo yankı özelliğini sağlar
Room 3 Normal oda yankı özelliğini sağlar
PaddedCell 2 Ses yalıtımlı yankı özelliğini sağlar
Generic 1 Genel ayarlamalar için kullanılır
Default 0 Ön seçili ayarlamalar için kullanılır

    EffectsReturnValue: Efek dönüşü özelliklerini belirler.

Failed 4 Kaynak erişilememekte ve efekt yapılamamaktır.
LocatedInHardware 1 Donanımsal efekt
LocatedInSoftware 2 Yazılımsal efekt
Present 0 Efekt kayıtlıdır.
SendLoop 6 Çevresel döngü
Unallocated 3 Efekt yazılımsal veya donanımsal olarak yapılamamaktadır.
Unknown 5 Efekt sisteme kayıtlı değildir.

    EffectStatus: Efek durumlarını belirler.

CurrentlyConverged 8  Acoustic Echo Cancellation (AEC) algoritması yapılmaktadır
PreviouslyDiverged 2 Acoustic Echo Cancellation (AEC) algoritması hataya uğramıştır
ContinuouslyConverged 1 Acoustic Echo Cancellation (AEC) algoritması yapılmıştır
Uninitialized 0 Acoustic Echo Cancellation (AEC) algorithm.başlangıçdurumundadır.

    Frequency Frekans değerlerini belirler.

Member Value Description
Original 0 Orjinal buffer frekansı
Max 200000 Maksimum buffer frekansı
Min 100 Minimum buffer frekansı.

    LockFlag: Buffer kilitleme bayrakları

Member Value Description
None 0 Buffer a kilit konulmamıştır.
EntireBuffer 2 Tüm buffera kilit konulmuştur
FromWriteCursor 1 Yazılan noktadan itibaren kilit konulmuştur.

    Mode3D: Üç boyutlu ses işlemleri için kullanılır.

Disable 2 Üç boyut işlemleri gerçersizdir
HeadRelative 1 Ses parametleri(yön,konum vs) geçerlidir.
Normal 0 Normal işlemler.

    OperationMode: Operasyon modları için kullanılır

FullDuplex 2 Efek direk olarak kayıt edilir ve tekrar kontrol edilmez
HalfDuplex 1 Half duplex moddadır.
PassThrough 0 Ses kaydı direk olarak yapılmaktadır fakat veri üzerinde hiç bir işlem yapılmamaktadır.

    Pan: Kanal boylarını(sağ-sol) ayarlamaya yarar.

Center 0 Tüm kanalların kanal boyları eşittir.
Right 10000 Sağ kanal açıktır sol kanal kapalıdır..
Left -10000 Sol kanal açıktır sağ kanal kapalıdır

    PositionNotifyFlag: Belli bir nokta üzerinde uyarı vermesi sağlanması için kullanılır.

OffsetStop -1 Kayıt durduğunda yada tekrar ettiğinde uyarı ver.
None 0 Hiçbir kesme,uyarı yoktur

    Volume: Ses şiddetini ayarlamaya sağlar.

Max 0 Maksimum ses seviyesindedir.
Min -10000 Minimum ses seviyesindedir.

    WaveFormatTag:Dalga formatı

Pcm 1 Bir yada iki kanal boylu dalga formatındadır.

    BufferPlayFlags:Buffer karakteristiklerini tanımlamak için kullanılan bayraklardır.

TerminateByPriority 32 Çalan ses yoktur.Çalan ses başka bir yetki seviyesi daha yüksek bir buffer tarafından durdurulmuştur.
TerminateByDistance 16 Çalan ses yoktur.Çalan ses başka buffer tarafından Mute3DAtMaximumDistance özelliği kullanarak durdurulmuştur.
TerminateByTime 8 Çalan ses yoktur.Çalan ses başka buffer tarafından daha bufferımız bitmesine az bir süre varken durdurulmuştur.
LocateInSoftware 4 Ses çalma sadece yazılımsal buffer iledir. Bu bayrak LocateInHardware  ile beraber kullanılamaz.
LocateInHardware 2 Ses çalma sadece donanımsal buffer iledir. Bu bayrak LocateInSoftware ile beraber kullanılmaz.
Looping 1 Buffer çalma bittiğinde tekrar başa dönüp çalmayı sağlar
Default 0 Ses çalma ön seçili durumdadı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 override void OnKeyPress(KeyPressEventArgs e)

{

    base.OnKeyPress(e);

        if ((int)e.KeyChar == (int)System.Windows.Forms.Keys.Escape) {

        Play_Click();

}

}

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 void Play_Click()

{

    try

    {

        ApplicationDevice = new Microsoft.DirectX.DirectSound.Device();

        ApplicationDevice.SetCooperativeLevel(this, CooperativeLevel.Priority);

        ApplicationBuffer = new SecondaryBuffer("Trumpet1.wav", ApplicationDevice);

    }

    catch(Exception ek)

    {

        MessageBox.Show(ek.ToString());

    }

    if(null != ApplicationBuffer)

        ApplicationBuffer.Play(0, BufferPlayFlags.Default);

}

 

Makalede ya da kodlarda bulunan hatalar ya da sorularınız için mehmetaliecer@gmail.com adresinden bana ulaşabilirsiniz. İyi çalışmalar.

Mehmet Ali ECER

www.mehmetaliecer.com

Kaynak Kod