SDL_mixer - zvuky a hudba jednoduše a snadno - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



C/C++

SDL_mixer - zvuky a hudba jednoduše a snadno

sdl now

11. března 2003, 00.00 | Tento článek popisuje knihovnu SDL_mixer, která je jednoduchým a šikovným nástrojem jak ozvučit svůj program. Dozvíte se jak rozběhat zvuky i hudbu.

SDL_mixer

A po delší době tu máme další článek o SDL, dnes probereme jak hru ozvučit. Zvuky a hudba dodávají hře rozměr. Samotné SDL umí jednoduše přehrávat soubory typu WAV, pokud chceme muziku musíme si pořídit dodatečnou knihovnu, mě se osvědčila knihovna SDL_mixer.

Popis

Tato knihovna umí přehrávat soubory typů:

Zvuky

  • WAVE/RIFF (.wav)
  • AIFF (.aiff)
  • VOC (.voc)

Hudba

  • MOD (.mod .xm .s3m .669 .it .med a další) - používá vložený mikmod
  • MIDI (.mid) používá timidity nebo midi hardware
  • OggVorbis (.ogg) potřebuje knihovnu ogg/vorbis
  • MP3 (.mp3) potřebuje knihovnu SMPEG

U WAV, AIFF a VOC podporuje až 8 kanálů, panning a takové efekty, jako je utlumení zvuku. A nejlepší na tom je, že to vše zvládá ve Windows i mnoha unixovských systémech, a tak nejsou problémy s přenositelností. Všechny funkce knihovny popisovat nebudu, neboť knihovna má velmi dobrou anglickou dokumentaci a soustředím se spíše na příklad jak s knihovnou pracovat.

Příklad

 V příkladu nastavíme zvukový výstup na frekvenci 22kHz, které jsou optimální i pro starší počítače. A 16b hloubku zvuku, stereo. A zvuk se bude přehrávat po blocích 1024 hodnot. Pokud zvolíme příliš malou délku bloku bude se volat obnovovací funkce častěji, což může na pomalých počítačích způsobit přeskakování zvuku. Pro poslech hudby můžeme nastavit třeba na 4096B, což ve hrách zase způsobí větší opožďování zvuku. Mixer má standardně  8 přehrávacích kanálů.

Pro lepší přehlednost co a v jakém kanálu přehráváme doporučuji si vytvořit enum s názvy zvuku (a kanálů tedy pokud zadáváme určitý kanál pro přehrání).

#include <stdlib.h>
#include <SDL.h>
#include <SDL_mixer.h>

const max_sounds=50;
Mix_Chunk *sounds[max_sounds];
Mix_Music *music;

//kanaly
enum {
SNDT_0,
SNDT_1,
SNDT_2,
SNDT_3,
SNDT_4,
SNDT_5,
SNDT_6,
SNDT_7
};

//zvuky
enum {
SND_ZVUK,
SND_NUM
};

int main(int argc,char *argv[])
{
if ( SDL_Init(SDL_INIT_AUDIO) < 0 ) {
    fprintf(stderr, "Problem: %s\n", SDL_GetError());
    exit(1); 
}
atexit(SDL_Quit);

//frekvence 22050 Hz
//MIX_DEFAULT_FORMAT - Signed 16-bit zvuky, v systemovem bytovem poradi (little,big endian)
//mono-stereo: pro mono vlozte 1, pro stereo 2


if (Mix_OpenAudio(22050/*frekvence [Hz]*/, MIX_DEFAULT_FORMAT, 2/*mono-stereo*/,1024/*velikost bloku*/)==-1)
{
    fprintf(stderr,"Mix_OpenAudio: %s\n", Mix_GetError());
    exit(1);
}

Poté nahrajeme zvuk

sounds[SND_ZVUK] = Mix_LoadWAV("zvuk.wav");
if (sounds[SND_ZVUK]==NULL) 
{
    fprintf(stderr,"zvuk [zvuk.wav] nebyl nahran\n");exit(2);}

Zde zvuk přehrajeme. Musíme pamatovat, že pokud přehráváme zvuk v kanálu kde již nějaký zvuk běží, tak je předchozí zvuk zastaven a spuštěn nový. Pokud se přehrává několik zvuků v různých kanálech, tak dojde k jejich zmixování. Pokud místo kanálu vložíme -1, tak se zvuk přehraje na prvním volném kanálu.

//kanal: -1 pro prvni volny kanal
//pocet opakovani x: zvuk se bude opakovat x+1 krat,x=-1 pro stale opakovani.

Mix_PlayChannel(-1/*kanal*/,sounds[SND_ZVUK]/*Mix_Chunk*/,0/*pocet opakovani*/);

Nahrajeme hudbu a spustíme ji ve smyčce.

music=Mix_LoadMUS("music.mp3");
if (!music) {
    printf("Mix_LoadMUS(\"music.mp3\"): %s\n", Mix_GetError());
    exit(2);
}

//pocet opakovani x: hudba se bude opakovat x krat,x=-1 pro stale opakovani.
//postupne zvysuje hlasitost hudby od 0 do 100% za 2000 ms po spusteni


Mix_FadeInMusic(music, -1/*pocet opakovani*/,2000 /*cas[ms]*/);

//lze i jen provest pouhe spusteni hudby
//Mix_PlayMusic(music, -1/*pocet opakovani*/);

SDL_Delay(5000);

Vypneme mixer.

 //ztlumi hudbu az do ticha a vypne
Mix_FadeOutMusic(2000);

SDL_Delay(1000);

Mix_CloseAudio();
return 0;
}

 Myslím, že tento kód by měl stačit pro představu, jak se knihovna SDL_mixer ovládá. Pokud potřebujete svůj projekt v SDL ozvučit, tak tato knihovna je jistě dobrou volbou.

Obsah seriálu (více o seriálu):

Tématické zařazení:

 » Rubriky  » C/C++  

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: