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.
    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_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 
    İş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.
 
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  -1   değ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:    %s\n", Mix_GetError());
    exit(2);
}
 
veya:

if(Mix_OpenAudio(22050, MIX_DEFAULT_FORMAT, 2, 4096)==-1)
{
    fprintf(stderr,   "Mix_OpenAudio:    %s\n",   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: %s\n", 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ı  çalmak da   bu  kadar  basit,   Mix_PlayChannel    komutu  ile
gerçekleştiriliyor.
 
çalmak için:

if(Mix_PlayChannel(-1, sample, 1)==-1)
{ 
    fprintf(stderr, "Mix_PlayChannel: %s\n", Mix_GetError());
}


İlk parametre ses dosyasını  çalacak kanalı belirtir. -1  değeri  ilk uygun  ses
kanalına bu  görevi verir.  İkinci  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:    %s\n",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.   Birde    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\"):  %s\n",  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: %s\n", 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: %s\n", 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
dökümantasyonuna        (http://jcatki.no-ip.org/SDL_mixer/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; ;)
[b]Ragnor/Manyetiq[/b] 