|
Přehrávání muziky pomocí knihovny FMOD
|
|
|
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];}
Home