Tweet

SDL Kütüphanesi ile ses dosyalarının kullanımı

Bu bölümde sdl de ses dosyalarının açılması ve kullanılması konusu kısaca işlenecektir.

Ses dosyalarının sdl de işlenebilmesi için üçüncü parti bir kütüphanenin projemize eklenmesi gerekir.SDL_mixer.lib kütüphanesi önceki bölümlerde yapıldığı gibi aynen indirilmeli ve
kütüphane yükleme yöntemlerimize göre aynı şekilde projemize eklenmelidir.[...]
Aşağıda görüldüğü üzere eklenen yeni kütüphane kullanılarak, ses dosyaları üzerinde çalışmamızı sağlayacak olan .h eklenmiştir.Ses verisini tutacak olan tipimiz Mix_Music ile Mix_Chunk tipleridir.
Mix_music müzik verisini tutar,mix_chunk ise müzik efektleri için kullanılır.

Diğer bilgiler comment olarak yeni olan bölümlere eklenmiştir.

Kaynak kod:

CODE:
#include <SDL.h>
#include <SDL_image.h>
#include <SDL_ttf.h>
#include <SDL_mixer.h>
#include <string>

#define WIDTH 640
#define HEIGHT 480
#define BPP 32

typedef SDL_Surface * surfacePtr;

surfacePtr screen = NULL;
surfacePtr message = NULL;
surfacePtr background = NULL;

SDL_Event event;

TTF_Font * font = NULL;

SDL_Color color = {0,0,0};

Mix_Music * music = NULL;

Mix_Chunk * scratch = NULL;
Mix_Chunk * high = NULL;
Mix_Chunk * low = NULL;
Mix_Chunk * med = NULL;


surfacePtr loadimage(std::string filename)
{
surfacePtr loaeded,optimized;

loaeded = IMG_Load(filename.c_str());

if(loaeded)
{
optimized = SDL_DisplayFormat(loaeded);

SDL_FreeSurface(loaeded);

if(optimized)
{
SDL_SetColorKey(optimized,SDL_SRCCOLORKEY,SDL_MapRGB(optimized->format,0,0xFF,0xFF));
}
}

return optimized;
}

void apply_surface(int x,int y,surfacePtr src,surfacePtr dest,SDL_Rect * clip = NULL)
{
SDL_Rect rect;
rect.x = x;
rect.y = y;

SDL_BlitSurface(src,clip,dest,&rect);
}

bool init()
{
if(SDL_Init(SDL_INIT_EVERYTHING) == -1)
return false;
screen = SDL_SetVideoMode(WIDTH,HEIGHT,BPP,SDL_SWSURFACE);

if(screen == NULL)
return false;

if(TTF_Init() == -1)
return false;

//Ses verilerinin ilk yüklendiği metod.
//İlk parametre kullanılacak frekans.
//ikinci parametre ses formatı.default seçildi.
//Üçüncüsü ses verileri için kaç kanal kullanılacak ? 1-mono 2-stereo
//Dördüncüde kullanılacak veri boyutu...

if(Mix_OpenAudio(22050,MIX_DEFAULT_FORMAT,2,4096) == -1)
return false;

return true;
}

bool loadfiles()
{
background = loadimage("background.png");

font = TTF_OpenFont("lazy.ttf",30);

if(background == NULL)
return false;

if(font == NULL)
return false;

//Ses dosyalarını yüklemek için kullanılır.Yüklenmezse dönüş tipi null dır.
music = Mix_LoadMUS("beat.wav");

if(music == NULL)
return false;

//Ses efektlerini yüklemek için kullanılır.Yüklenmezse dönüş tipi null dır.
scratch = Mix_LoadWAV("scratch.wav");
high = Mix_LoadWAV("high.wav");
med = Mix_LoadWAV("medium.wav");
low = Mix_LoadWAV("low.wav");

if( ( scratch == NULL ) || ( high == NULL ) || ( med == NULL ) || ( low == NULL ) )
{
return false;
}


return true;

}

void cleanup()
{
SDL_FreeSurface(background);

//Ses bilgilerinin temizlenmesi.

Mix_FreeChunk(scratch);
Mix_FreeChunk(low);
Mix_FreeChunk(high);
Mix_FreeChunk(med);
Mix_FreeMusic(music);

TTF_CloseFont(font);

Mix_CloseAudio();

TTF_Quit();

SDL_Quit();
}

int main(int argc,char *argv[])
{

if(init() == false)
return 1;

bool quit = false;

if(loadfiles() == false)
return 1;

apply_surface(0,0,background,screen);

message = TTF_RenderText_Solid(font,"press 1 2 3 4 ",color);

if(message == NULL)
return 1;

apply_surface((WIDTH - message->w)/2,100,message,screen);

SDL_FreeSurface(message);

message = TTF_RenderText_Solid(font,"press 9 to pause",color);

if(message == NULL)
return 1;

apply_surface((WIDTH - message->w)/2,200,message,screen);

SDL_FreeSurface(message);

message = TTF_RenderText_Solid(font,"press 0 to stop",color);

if(message == NULL)
return 1;

apply_surface((WIDTH- message->w)/2,300,message,screen);

if(SDL_Flip(screen) == -1)
return 1;


while(quit == false)
{
while(SDL_PollEvent(&event))
{
if(event.type == SDL_KEYDOWN)
{
if(event.key.keysym.sym == SDLK_1)
{
//Ses efekti olarak seçilen çalınacak.
if(Mix_PlayChannel(-1,scratch,0) == -1)
return 1;
}
else if(event.key.keysym.sym == SDLK_2)
{
//Ses efekti olarak seçilen çalınacak.
if(Mix_PlayChannel(-1,high,0) == -1)
return 1;
}
else if(event.key.keysym.sym == SDLK_3)
{
//Ses efekti olarak seçilen çalınacak.
if(Mix_PlayChannel(-1,med,0) == -1)
return 1;
}
else if(event.key.keysym.sym == SDLK_4)
{
//Ses efekti olarak seçilen çalınacak.
if(Mix_PlayChannel(-1,low,0) == -1)
return 1;
}
else if(event.key.keysym.sym == SDLK_9)
{
//Müzik çalınacak
if(Mix_PlayingMusic() == 0)
{
if(Mix_PlayMusic(music,-1) == -1)
return 1;
}
else
{
//Müzik durdurulacak veya devam edilecek.
if(Mix_PausedMusic())
{
Mix_ResumeMusic();
}
else
{
Mix_PauseMusic();
}
}
}//Müzik kapatılacak.
else if(event.key.keysym.sym == SDLK_0)
{
Mix_HaltMusic();
}
}
if(event.type == SDL_QUIT)
quit = true;
}
}

cleanup();

return 0;
}


hgedek
hgedek@gmail.com
17 Eylul 2007 19:16

İlgili Olabilecek Makaleler


Yorumlar (0)




Ziyaretçi olarak yorum yazamazsınız. Üye olmak için tıklayın Üye iseniz giriş yapın.



MENÜ » FORUM
Menü » Takip et
RSS Facebook Twitter Friendfeed
Sık Kullanılanlar Google Yahoo Live
Menü » Paylaş
E-Posta ile gönder Twitter Facebook Friendfeed
Buzz Stumbleupon Delicious Digg