Bu sayfadaki yazılar
Sayfanın metni
Sayfa 25
- AIFF (.aiff) - VOC (.voc) - MOD (.mod .xm .s3m .669 .it .med ve fazlası) - MIDI (.mid) - OggVorbis (.ogg) - MP3 (.mp3)
Hemen kullanımını anlatmaya geçiyorum. Projenize SDL_Mixer'ı eklemek için derleyiciye -lSDLMixer bayrağını eklemeniz gerekmektedir. Include etmeniz gereken tek bir dosya var, SDL_Mixer.h dosyası. Bunun dışında SDL_Mixer'ı kullanırken dikkat etmeniz gereken bir şey daha var. SDL_Mixer'ı kullandığınız sırada SDL'in kendi içindeki ses sistemi ile ilgili birkaç komutu kullanamıyoruz. Bunlar; SDL_OpenAudio Yerine Mix_OpenAudio'yu kullanın. SDL_CloseAudio Yerine Mix_CloseAudio'yu kullanın. SDL_PauseAudio Yerine Mix_Pause(-1) ve Mix_PauseMusic'i kullanın. Yerine Mix_Resume(-1) ve Mix_ResumeMusic'i kullanın. SDL_LockAudio Bu işi SDL_Mixer sizin için hallettiği için kullanmanız gerekmeyebilir. Yine de kullanmak problem yaratabilir. SDL_UnlockAudio Bu işi SDL_Mixer sizin için hallettiği için kullanmanız gerekmeyebilir. Yine de kullanmak problem yaratabilir.
Aşağıdaki komutları ise rahatlıkla kullanabilirsiniz.
SDL_AudioDriverName Normal şekilde çalışacaktır. SDL_GetAudioStatus Bu da sorunsuzca çalışacaktır, ama büyük ihtimalle sessiz durumdayken bile SDL_AUDIO_PLAYING değerini döndürecektir.
SDL_Mixer içindeki fonksiyonlara ve kullanımlara gelirsek, önce Mix_OpenAudio ile başlamalıyız. Bu komut ile SDL_Mixer ses sistemini açmaya yarar.
int Mix_OpenAudio(int frequency, Uint16 format, int channels, int chunksize)
frequency ses çıktısının frekans değerini belirtir. Oyunlar için uygun bir değer olarak MIX_DEFAULT_FREQUENCY adıyla tanımlanmış olan 22050 değerini kullanabilirsiniz. Ayrıca 44100 değerini de kullanabilirsiniz ki bu değer CD audio frekans değeridir. Ama bu değer daha fazla CPU gücü tüketir.
format ses çıktısının formatını belirtir. Özel bir durum yoksa MIX_DEFAULT_FORMAT değeri işinizi görür.
channels ses çıktısının kaç kanallı olduğunu belirtir. Stereo için 2, mono için 1 değerini verin.
chunksize ise ses çıktısı için kullanılacak byte'lardır.
Format için kullanabileceğiniz diğer seçenekler: AUDIO_U8 İşaretsiz 8-bit sesler AUDIO_S8 İşaretli 8-bit sesler AUDIO_U16LSB İşaretsiz 16-bit samples, little-endian byte düzeninde AUDIO_S16LSB İşaretli 16-bit samples, little-endian byte düzeninde AUDIO_U16MSB İşaretsiz 16-bit samples, big-endian byte düzeninde AUDIO_S16MSB İşaretli 16-bit samples, big-endian byte düzeninde AUDIO_U16 AUDIO_U16LSB ile aynı (geriye uyumluluk için büyük ihtimalle) AUDIO_S16 AUDIO_S16LSB ile aynı (geriye uyumluluk için büyük ihtimalle) AUDIO_U16SYS İşaretsiz 16-bit samples, sistemin byte düzeninde AUDIO_S16SYS İşaretli 16-bit samples, sistemin byte düzeninde
MIX_DEFAULT_FORMAT AUDIO_S16SYS ile aynıdır.
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 24
Gibi bir görüntü çıkacak. Yani belki bazı frame'lerde tam istediğimiz gibi gözükmeyecek yani hem task a'nin o saniyede ki hali ve hem de task b'nin o saniyede ki hali... ama.. bir nevi process'lere bölüm scheduling sistemi bunu yükten kurtaracak. Öbür türlü yaptığımızda belki de 40fps'lik olayımız aslında 20fps olacaktı.. Yani olayı bir nevi workcompression gibi düşünün. (bilenler için.. Pal görüntü gibi.. Odd fields - even fields... Her frame'de sadece ya odd field'lar gönderilir.. Ya da even... Ancak ve ancak ikisi bir olunca bir frame olur.. Ama birinci frame'in odd'u geldiğinde.. Aslında ikinci frame'in even'i olabilir elimizde. Ek bir bilgi olarak yuv encoding de benzeri bir prensiple çalışır.)
Bu sistemin getirdiği başka bir avantaj ise, birden çok cpu'muzun olduğu durumlar için geçerli. Yani elimizde her zaman execute edilmesi beklenen bir group task var. Ve bunların execution'ını biz aslında birbirinden bağımsız olarak değişik processorlere yaptırabiliriz. Hali ile
2. Frame total usage Time 25------------30------------35--------------40------------45-----------50
___________ Cpu1 | |___________________________________________________________ ___________ Cpu2 | |___________________________________________________________
__________________________________________________ Gpu ___| |__________________
Haline dönüştürebiliriz. Bu da aslında bizim için işlemciye çok daha fazla yüklenebileceğimiz manasına geliyor. Neticede her task bir iş yapıyor. Ve tasklar birbirinden tamamen bağımsız. Ve eğer hangi sıra ile yapıldıkları da önem taşımıyorsa o zaman bir task/thread manager gibi bir birim vasıtası ile eşit miktarda CPU'lara bölüştürülebilir. (Tam eşit olmaz tabii ki ama.. Olduğu kadar)... Bunun nasıl olacağına o birimi incelerken değineceğim. Ama çok basit mantığını anlatmam gerekirse iki thread olduğunu düşünün ve bunların wait state'de olduğunu düşünün. Ve ortada bir queue var. Eğer queue'ya yeni bir task/mesaj bir şey gelirse bunlardan biri uyanıyor ve queue'dan onu alıp execute'a başlıyor.. Sonra bir adet daha gelirse ikincisi de uyanıyor. V.s. Eğer birisi işini bitirirse tekrar wait state'e gelmeden queue'ya tekrar bakıyor ve eğer queue'da daha birkaç adet task daha varsa gene onlardan birini alıp execute mode'una giriyor. Neyse fazla kafa karıştırmadan bunu daha sonra anlatayım.
Neyse umarım bu timer konusu ve sync olayları hakkında bir bilgi verip temel bir design'ın nasıl olması gerektiği konusunda aydınlatabilmişimdir. Bu yazıya devam edeceğim kaldığım yerden şimdi diğer konulara dallanırsam çok uzayabileceği inancındayım. Bir sonraki yazımda task/thread manager kısmına değinmeyi düşünüyorum. Daha ileriki bölümlerde ise memory manager / resource manager ve temel şeyleri yapan bir gfx lib'i nasıl yapmalıyız şeklinde devam edeceğim ilk design'ımıza. 'Lord of the demos' adlı yazı dizisi devam edecektir.
ciao!
~sensei/rt - csermen@gmail.com
******************************************************************************** ÖĞRETİCİ DÖKÜMAN : SDL_MIXER İLE SES VE MÜZİK
SDL_Mixer SDL kütüphanesinde ses ve müzik kullanımını kolaylaştırmak için geliştirilmiş bir kütüphanedir. Ses ve müzik dosyalarını yüklemek ve çalmak üzere işinizi kolaylaştıracak birçok fonksiyona sahiptir. Öncelikle SDL_Mixer kütüphanesi ile kullanabileceğiniz dosya formatları; - WAVE/RIFF (.wav)