SDL_Mixer ile Ses ve Müzik

SDL_Mixer ile Ses ve Müzik

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)
* - 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.
Yinede kullanmak problem yaratabilir.
SDL_UnlockAudio
Bu işi SDL_Mixer sizin için hallettiği için kullanmanız
gerekmeyebilir.
Yinede kullanmak problem yaratabilir.
Aşağıdaki komutları ise rahatlıkla kullanabilirsiniz.
SDL_AudioDriverName
Normal şekilde çalışacaktır.
SDL_GetAudioStatus
Buda 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_FREQUANCY adıyla tanımlanmış olan 22050 değerini kullanabilirsiniz. Ayrıca
44100 değerinide 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
Işaretsiz 8-bit sesler
AUDIO_S8
Işaretli 8-bit sesler
AUDIO_U16LSB
Işaretsiz 16-bit samples, little-endian byte düzeninde
AUDIO_S16LSB
Işaretsiz 16-bit samples, little-endian byte düzeninde
AUDIO_U16MSB
Işaretsiz 16-bit samples, big-endian byte düzeninde
AUDIO_S16MSB
Iş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
Işaretsiz 16-bit samples, sistemin byte düzeninde
AUDIO_S16SYS
Işaretli 16-bit samples, sistemin byte düzeninde

MIX_DEFAULT_FORMAT AUDIO_S16SYS ile aynıdır.

Chunksize için uygun bir değer olarak 4096 verebilirsiniz. Ama ses efektlerinin arkaplanda gereğinden uzun süre sürdüğünü düşünüyorsanız bu değeri küçük tutmayı deneyebiliriniz. Yalnız
değer küçüldükçe yavaş sistemlerde ses çıktısının atlanması olasıdır.

Fonksiyon başarılı olarak sona ererse 0, hata verirse -1değerini döndürür.

ses ortamını açmak için örnek kod:
if(Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 1024)==-1) {
fprintf(stderr, "Mix_OpenAudio: %sn", Mix_GetError());
exit(2);
}

veya:

if(Mix_OpenAudio(22050, MIX_DEFAULT_FORMAT, 2, 4096)==-1) {
fprintf(stderr, "Mix_OpenAudio: %sn", Mix_GetError());
exit(2);
}

Ses sistemini açtıktan sonra kapatmak için ise MixCloseAudio fonksiyonunu kullanırız. Kullanımı oldukça basittir.

kapatmak için örnek kod:
Mix_CloseAudio();

Ses sistemini açıp kapatabiliriz. Şimdi sırada biraz ses çıkarmak var . SDL_Mixer ile birçok yaygın formattaki ses dosyasını kolayca hafızaya yükleip çalabilirsiniz. SDL_Mixer'da çalacağınız dosyalar iki tiptir.

1. Sample
2. Music


Sample'lar basit ses efektleridir diyebiliriz. Veya ufak ses dosyaları. Daha da basitçe müzik parçası olmayan ses dosyalarıdır dersek sanırım yanlış olmaz. Hafızada bir sample verisi saklarker kullanacağımız yapının adı Mix_Chunk 'tır. Ses dosyasını hafızaya yüklerken kullanacağımız komutun adı da Mix_LoadWav() 'dır. Adı sizi yanıltmasın, bu fonksiyon sadece wav dosyalarını değil;
wave, aiff, riff, ogg ve voc dosya formatlarını okuyabilir.

wav yüklemek için örnek kod:
Mix_Chunk *sample;

sample=Mix_LoadWAV("sample.wav");
if(!sample) {
fprintf(stderr,"Mix_LoadWAV: %sn", Mix_GetError());
// hata olursa diye
}

Programımızı kapatırkende yüklediğimiz ses dosyalarını hafızadan silmek için Mix_FreeChunk komutu kullanılır.

örnek:
Mix_FreeChunk(sample);
sample=NULL;

Ses dosyalarını çalmakda bu kadar basit, Mix_PlayChannel komutu ile gerçekleştiriliyor.

çalmak için:
if(Mix_PlayChannel(-1, sample, 1)==-1) {
fprintf(stderr,"Mix_PlayChannel: %sn",Mix_GetError());
}

Ilk parametre ses dosyasını çalacak kanalı belirtir. -1 değeri ilk uygun ses kanalına bu görevi verir. Ikinci parametre çalınacak olan ses dosyasıdır. Üçüncü parametre sample'ın kaç defa çalacağını belirtir. Bir hata oluşurdu sample çalınamazsa fonksiyon -1 değerini döndürür.

SDL_Mixer içinde ayrıca ses dosyalarını çalarken basit efektlerde uyguluamanızı sağlayan fonksiyonlar bulunmaktadır. Örneğin Mix_FadeInChannel fonksiyonu ile bir ses dosyasını
(sample) fade in(yavaş yavaş ortaya çıkma) efekti uygulayarak çalabiliriz.

if(Mix_FadeInChannel(-1, sample, 1, 1000)==-1) {
fprintf(stderr,"Mix_FadeInChannel: %sn",Mix_GetError());
}

Bütün parametreler Mix_PlayChannel fonksiyonu ile aynıdır bu fonksiyonda. Sadece son parametre olan 1000 değeri efektin kaç milisaniye sonra başlayacağı değerini bildirir. Bir de bu fonksiyonun tersi olarak Mix_FadeOutChannel fonksiyonu bulunmaktadır.

Mix_FadeOutChannel(int channel, int ms);

Bu fonksiyon ile belirtilen kanal belirtilen milisaniye içinde sesi kısılarak kapatılır. Bu komut zaten çalmakta olan bir kanala uygulanacağı için ses dosyasını belirtmeye gerek yoktur. Ayrıca Mix_HaltChannel komutuyla sesi anında kapatabilirsiniz.

Mix_HaltChannel(int channels);

şeklinde uygulanır. Kanal değeri olarak ya o kapatmak istediğiniz kanalın numarasını yada bütün kanalları kapatmak için -1 değerini verebilirsiniz. -1 değeri diğer bütün fonsiyonlarda da aynı şekilde
bütün kanalları belirtir. Kanallarla ilgili yapabileceklerimiz arasında kanalın ses seviyesini
değiştirebilirsiniz.

Mix_Volume(int channel, int volume);

Channel ile kanalın numarası yada -1 ile bütün kanallar belirtilebilir. Volume ise sesin yüksekliğinin belirtildiği değişkendir. Bu fonksiyonun birde ses dosyasına özel ses seviyesi belirtebileceğiniz
versiyonu bulunmaktadır.

Mix_VolumeChunk(Mix_Chunk *chunk, int volume);

Chunk değişkeni ile verilen ses dosyasının ses yüksekliği volume değişkenine göre değiştirilir.


Sırada müzik dosyaları ile ilgili işlemler var.

Mix_Music *music;

Mix_Music veri yapısı hafıza müzik dosyalarını saklayacağımız yapıdır.
Müzik dosyaları Mix_LoadMus fonksiyonu ile yüklenir.

if(!music=Mix_LoadMUS("music.mp3")) {
fprintf(stderr,"Mix_LoadMUS("music.mp3"): %sn", Mix_GetError());
}

Bu fonksiyon ile wav, mod, midi, ogg ve mp3 dosyalarını yükleyebilirsiniz.

Mix_FreeMusic(music);
music=NULL;

Yukarıdaki yöntem ilede işimiz bittiğinde yada programı kapatırken müzik dosyalarının verilerini hafızadan temizleriz.

Müzik dosyalarını çalmak için Mix_PlayMusic fonksiyonu kullanılır.

if(Mix_PlayMusic(music, -1)==-1) {
fprintf(stderr,"Mix_PlayMusic: %sn", Mix_GetError());
}

music parametresi çalınacak müzik dosyasını belirtir. -1 değeri ise dosyanın sonsuz döngüde çalınacağını belirtir. -1 yerine parçanın tekrar edilmesini istediğimiz sayıyı yazabiliriz.

Fade in efektini sample'lar gibi müzik dosyalarınada uygulayabiliriz.

if(Mix_FadeInMusic(music, -1, 2000)==-1) {
fprintf(stderr,"Mix_FadeInMusic: %sn", Mix_GetError());
}

Fade in efekti olduğu gibi Fade out efektide vardır. O ise sadece tek parametre alır. Fade out efektinin süresi (milisaniye cinsinden).

Mix_FadeOutMusic(3000);

Mix_PlayMusic fonksiyonu ile aynıdır herşey. Sadece son değer Fade in efektinin tamamlanacağı süreyi milisaniye cinsinden belirtir.

Bir müzik dosyasının çalmasını durdurmak için iki fonksiyonumuz vardır. Mix_HaltMusic ve Mix_PauseMusic. Mix_HaltMusic müzik çalınmasını hemen durdurur. Bütün fade efektlerinide keser. Mix_PauseMusic fonksiyonu ise çalmakta olan müziği sadece duraklatır. Mix_ResumeMusic fonksiyonu ise duraklatılan yerden çalmaya devam edilmesini sağlar. Bu fonksiyonu durdurulmuş (Halt), duraklatılmış(Pause) veya çalmakta olan müzik ile kullanmak güvenlidir, hataya neden olmaz.

Mix_HaltMusic();
Mix_PauseMusic();
Mix_ResumeMusic();


Evet bu döküman ile SDL_Mixer kullanımına giriş yaptık. SDL_Mixer'ın bütün yeteneklerini anlatmadım size ama anlattıklarım ile SDL_Mixer kullanmaya hemen başlayabilirsiniz. Gerisi için şimdilik orijinal SDL_Mixer dokümantasyonuna (http://jcatki.no-ip.org...er/SDL_mixer_frame.html) bakmalısınız. Daha sonra SDL_Mixer'ın daha detaylı kullanımını anlatan bir döküman daha yazabilirim.

Not: 1 saniye == 1000 milisaniye

Ozan Emirhan Bayyurt

Yorumlar

Bu blogdaki popüler yayınlar

SDL Nedir?

Doxygen Kullanımı

OpenGL'de Line (çizgi) Çizdirme