OpenGL Game Tutorial
Visual C++ 6.0



Přehrávání muziky pomocí knihovny FMOD


Příklad a zdroják ke stažení (2 932 k)


FSOUND_Init();
FSOUND_Sample_Free();
FSOUND_Close();
FSOUND_Sample_Load();
FSOUND_Sample_SetLoopMode();
FSOUND_PlaySound();
FSOUND_SetPaused();
FSOUND_GetPaused();
FSOUND_StopSound();
FSOUND_SetVolume();




Zdrojový kód přehrávání muziky pomocí FMOD vytvořil opět kolega Jiří Studnička (Well). Dokonce kažký řádek popsal. Jirko děkuju.

Jirka za mě všechno udělal a mě nezbývá nic jiného než o FMOD napsat tutorial a opět dělat chytrýho na cizý účet.

FMOD je kvalitní knihovna na přehrávání 3D zvuků. Zatím se zaměříme na to nejjednodužší a to je přehrávání jednoho zvukového samplu v nekonečné smyčce. FMOD však dokáže zajímavější věci. Například přehrávání více zvuků najednou. U každého zvuku jde nastavit Echo, Chorus, Flanger atd.. Lze nastavit pozici zvuku v 3D světě. Na tyto zajímavůstky se podíváme někdy příště.

V konstruktoru třídy K_CMusic si nastavíme potřebné hodnoty.

// Konstruktor
K_CMusic::K_CMusic(int i_num)
{
     ppsoundSamples = new FSOUND_SAMPLE *[i_num];     // Alokuj paměť pro nový sampl
     iNumOfSamples = i_num;                           // Nastav počet samplů
     iMaxChannels = 64;                               // Nastav maximální počet kanálů
     FSOUND_Init(44100, iMaxChannels, 0);             // Nastav kvalitu samplu
}

Funkce LoadSample() načítá zvukový sampl WAV, nebo MP3.

// Načti sampl
void K_CMusic::LoadSample(int i_num, char *pc_file)
{
     char pc_path[80] = "music/";                                                             // Nastav cestu samplu
     strcat(pc_path, pc_file);                                                                // Přidej k cestě jméno samplu
     ppsoundSamples[i_num] = FSOUND_Sample_Load(FSOUND_FREE, pc_path, FSOUND_2D, 0);          // Načti sampl
     if(!ppsoundSamples[i_num])                                                               // Jestliže sampl neexistuje, tak
       MessageBox(NULL, "Do not play music", "KEngine", IDOK);                                // Vyhoď chybovou hlášku
}

Funkce PlayLoop() nám sapl bude přehrávat pořád dokolečka.

// Přehrávej sampl pořád dokola
int K_CMusic::PlayLoop(FSOUND_SAMPLE *psound_sample)
{
     FSOUND_Sample_SetLoopMode(psound_sample, FSOUND_LOOP_NORMAL);     // Přehraj sampl ve smyčce
     int i_channel;                                                    // Číslo kanálu
     i_channel = FSOUND_PlaySound(FSOUND_FREE, psound_sample);         // Získej číslo kanálu, na kterém se sampl přehrává

     return i_channel;                                                 // Vrať funkci číslo kanálu
}

A to je vše. Tyto funkce se volájí jen jednou při inicializaci scény.


K_CMusic *music;               // Hudební sampl 1

//----------------------------------------------------------------------------------------------------//

// Načti scénu
void K_CScene::InitScene( void )
{

     ...
     ...
     ...

     music = new K_CMusic(1);                       // Alokuj paměť pro hudební sampl
     music->LoadSample(0, "sample.mp3");            // Načti hudební sampl
     music->PlayLoop(music->GetSample(0));          // Přehrávej sampl pořád dokola

     ...
     ...
     ...
}

Ještě tu máme další funkce, které zatím nepoužíváme, ale fungujou. Funkce Play() přehraje sapl jen jednou

// Přehraj sampl
int K_CMusic::Play(FSOUND_SAMPLE *psound_sample)
{
     FSOUND_Sample_SetLoopMode(psound_sample, FSOUND_LOOP_OFF);     // Přehraj sampl jen jednou
     int i_channel;                                                 // Číslo kanálu
     i_channel = FSOUND_PlaySound(FSOUND_FREE, psound_sample);      // Získej číslo kanálu, na kterém se sampl přehrává

     return i_channel;                                              // Vrať funkci číslo kanálu
}


Funkce Pause() pausne, nebo opět rozjede sampl a to podle hodnoty b_yes_no.

// Pausni, nebo opět spusť sampl
void K_CMusic::Pause(int i_channel, BOOL b_yes_no)
{
     FSOUND_SetPaused(i_channel, b_yes_no);
}

Funkce SetVol() nastavuje hlastitost přehrávání. Hlasitost se nastavuje proměnnou i_vol, která může nabývat hodnot 0 - 255 z čehož 0 neni slyšet a 255 je nejvíc

// Nastav hlasitost samplu
void K_CMusic::SetVol(int i_channel, int i_vol)
{
     FSOUND_SetVolume(i_channel, i_vol);
}

Funkce IfPaused() vrací, jestli je sampl pausnutý, nebo jestli hraje. Vhodné použití: Pause(i_channel, !IfPaused(i_channel)); - jednou hraje, jednou ne. U výše 4 zmíněných funkcí je první parametr i_channel, který je potřeba pro manipulaci se samplem. Vrátí nám ho fce Play(), nebo PlayLoop()

// Zjisti jestli je sampl pauslej, nebo ne
BOOL K_CMusic::IfPaused(int i_channel)
{
     return FSOUND_GetPaused(i_channel);
}

Poslední funkce *GetSample(), nám vrací ukazatel na sampl. Vhodné použití: PlayLoop(GetSample(0)); - přehraje první sampl

FSOUND_SAMPLE *GetSample(int i_num){return ppsoundSamples[i_num];}

A to je opravdu vše. Ještě jednou děkuji Jirkovi Studničkovi (Well), za zdroják a pokec k němu.

No a příště si něco řeknem o bitmap fontech.

Kwan




Home