Delphi (10.) - knihovna FMOD

V článku o projektu MEngine jsem psal, že tento balík obsahuje také knihovnu FMOD. Pokud nevíte, o co se jedná, tak se podívejte na tento článek. Sami uvidíte, že práce se zvukem na profesionální úrovni není vůbec složitá a zvládne ji i začátečník. Vše je vysvětleno na jednoduchém přehrávači mp3 a jiných souborů.

Nejprve stručná charakteristika: Jedná se o jednoduché stabilní rozhrání s podporou standardů jako DirectSound, DirectSound3D (DirectX 6.1, DirectX 7.0 a DirectX8), A3D 3.0 a EAX 2.0 i 3.0. Rozhrání je multiplatformní, tzn. že je možno rozchodit jej v Linuxu, Unixu, pod Windows 9x-XP, WinCE/PocketPC a nově i na konzoli XBox. FMOD rozchodíte i na 16-ti bitových zvukových kartách. Výhodou je, že s knihovnami FMOD můžete pracovat v Microsoft Visual C++ 5 & 6, Borland C++ Builderu, Delphi, Kylixu a Visual Basicu.

Toto rozhrání je schopné bez problémů "vstřebat" soubory typu MOD, S3M, XM, IT, MID, RMI, SGT, WAV, MP2, MP3, OGG, WMA, ASF. Instalace by měla být bez problémů: Je nutno stáhnout z domovské adresy balík, který obsahuje soubory fmod.pas,fmoderrors.pas, fmod.dll (fmoderrors.pas se v balíku nemusí objevit - není důležité pro chod rozhrání). První varianta je, že soubory fmod.pas a fmoderrors.pas (popř. i fmod.dcu a fmoderrors.dcu) umístíte do vámi vytvořeného adresáře (např. C:\FMOD). Potom také musíte v Delphi v menu Tools - Environment options - Library přidat do položky Library Paths tento adresář. Soubor fmod.dll je nutno umístit do složky Windows\System (ve Win9x, WinME), nebo do složky Windows\System32 (platí pro WinNT, Win2k, WinXP). Ve druhé variantě je třeba skopírovat všechny tyto soubory do adresáře každého projektu, ve kterém budeme využívat knihovny FMOD.

Co se týče licence je poměrně výhodná pro ty, kdo plánují tvořit freewarové progrmy - Ti mají licenci zdarma. Pro shareware ve Win32, CE, LINUX program se platí 100USD(jeden sharewarový program) - 250USD(neomezeně) a pro plně komerční využítí si můžete v peněžence nachystat celých 1250 USD(jedna licence) - 3200USD(neomezeně). Pro konzole se cena pohyboje od 5000USD do 17000USD, což už je pěkná pálka...

V dnešním článku vytvoříme tento jednoduchý přehrávač hudebních souborů

Jak vytvořit jednoduchý přehrávač hudebních souborů?

Pro zpřístupnění všech funkcí, které nám FMOD nabízí bychom měli do uses přidat řádek:

uses
  FMod, FModErrors;

V public declarations mám definovány tyto proměnné:

  private
    Sound : PFSoundSample;
    SoundChannel: Longint;
    DriverName : pchar;
    Paused : boolean;

V události FormCreate budou následující funkce:

procedure TForm1.FormCreate(Sender: TObject);
var i: integer;
begin
  if (FSOUND_GetVersion() < FMOD_VERSION) then
  begin
    FMODError('FMOD - chybná verze');
  end;

V tomto kousku zdrojáku máme vyřešen test správné verze knihovny FMOD. Já jsem v době psaní tohoto článku pracoval s verzí 3.5, je ale možné že už je vydána verze další...

  // nastartuje sound systém na 44 Khz
  if (NOT FSOUND_Init(44100, 8, FSOUND_INIT_GLOBALFOCUS)) then
  begin
    FMODError('Chyba při inicializaci');
  end;

Tato funkce provedla inicializaci knihovny FMOD. První parametr udává vzorkovací frekvenci a měl by být v rozsahu 4000 - 65535. 44kHz je již vžitý standart pro přenosové pásmo do 20kHz. Další parametr udává maximální počet použitých softwarových kanálů, což udává maximální počet mixovaných zvuků. Tuto hodnotu je možno zjistit funkcí FSOUND_GetMaxChannels. Posledním parametrem se mění různé režimy: FSOUND_INIT_ENABLEOUTPUTFX je mód, v němž může být mixer buffer ovlivňován efekty DX8, FSOUND_INIT_GLOBALFOCUS nastavuje, že hudba hraje i když okno není aktivní. Parametry je také možno spojovat spojkou OR.

  FSOUND_SetOutput(FSOUND_OUTPUT_WINMM);

Tímto příkazem jsem nastavil, že má být použito DirectSound rozhrání.

  DriverName := FSOUND_GetDriverName(FSOUND_GetDriver());
  Label1.Caption := DriverName;

  for i := 0 to FSOUND_GetNumDrivers() do
  begin
    DriverName := FSOUND_GetDriverName(i);
    ListBox1.Items.Add(DriverName);
  end;
end;

Pro informaci jsem ještě zobrazil do ListBoxu seznam všech ovladačů, které je možno využít k výsutpu a do Label1 jsem vložil aktuálně používaný ovladač. Funkce FSOUND_GetDriver vrací číslo aktuálně používaného ovladače, FSOUND_GetNumDrivers vrátí celkový počet ovladačů a FSOUND_GetDriverName zase vrací jméno ovladače. Tato funkce vypisuje chybové hlášky:

procedure TForm1.FMODError(error: string);
var mess, code: string;
begin
  code := FMOD_ErrorString(FSound_GetError());
  mess := error+chr(13)+'(error code: '+(code)+')';
  MessageBox(Application.Handle,PChar(mess),'Error',MB_OK);
end;

Tuto proceduru voláme vždy v případě neúspěchu nějakého příkazu zároveň s řetězcem, který oznamuje, co se nepovedlo. Funkce také přidá popis poslední chyby. Tak v této funkci jsem se i já naučil používat OpenDialog, který velmi usnadňuje práci při otevírání souborů. Tato procedura se spustí při kliknutí na tlačítko OpenDialog:

procedure TForm1.OpenFileClick(Sender: TObject);
begin
  if (OpenDialog1.Execute() = false) then exit;

  FSOUND_StopSound(soundChannel);
  Sound := FSOUND_Sample_Load(
    FSOUND_FREE,
    pointer(OpenDialog1.FileName),
    FSOUND_STEREO,
    0
    );
  if (Sound=nil) then
    FMODError('Soubor se nepodařilo načíst');
end;

OpenDialog jsme otevřeli funkcí OpenDialog.Execute() a pokud se vybral jakýkoliv soubor, který vyhovuje filtru nastavenému komponentě OpenDialog pokračujeme dál. Přerušíme přehrávaný zvuk a otevřeme nový pomocí pointeru na OpenDialog1.FileName.

Funkce FSOUND_Sample_Load vrací ukazatel na zvukový záznam, její parametry jsou: Číslo, pod které se má nahraný zvuk uložit. Pokud uvedem FSOUND_FREE tak se uloží pod první volné číslo. Další parametry udávají cestu k souboru a druh zvuku (FSOUND_HW3D, FSOUND_STEREO,...). Tato procedura začne přehrávat načtenou skladbu:

procedure TForm1.PlayFileClick(Sender: TObject);
begin
  soundChannel := FSOUND_PlaySound(FSOUND_FREE,Sound);
  FSOUND_SetVolume(soundChannel, Volume.Position);
  Pozice.Max := FSOUND_Sample_GetLength(Sound);

  if (Loop.Checked = true) then
   FSOUND_SetLoopMode(soundChannel, FSOUND_LOOP_NORMAL)
  else
   FSOUND_SetLoopMode(soundChannel, FSOUND_LOOP_OFF);
end;

Funkce FSOUND_PlaySound zajistí přehrání zvuku. Funkce také vrací číslo kanálu, na kterém se zvuk přehraje. FSOUND_SetVolume nastaví hlasitost výsupu podle jezdce Volume. Dále ještě nastavíme stavový ukazatel, abysme věděli, v jaké části skladby se nacházíme. a nastavíme mód přehrávání - smyčku nebo normal. Tahle procedura zajistí změnu hlasitosti přehrávání při změně polohy jezdce:

procedure TForm1.VolumeChange(Sender: TObject);
begin
  FSOUND_SetVolume(soundChannel, Volume.Position);
end;

Stisknutím tlačítka Stop zastavíme přehrávání aktuální skladby:

procedure TForm1.StopClick(Sender: TObject);
begin
  FSOUND_StopSound(soundChannel);
end;

Na formulář jsem také přidal Timer, který se stará o aktualizaci pozice posuvníku každých 250ms:

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  pozice.Position := FSOUND_GetCurrentPosition(soundChannel);
end;

Procedura pro pauznutí a znovuspuštění přehrávání zvuku je v mém příkladu následující:

procedure TForm1.PauseClick(Sender: TObject);
begin
  if Paused then FSOUND_SetPaused(SoundChannel,false)
  else FSOUND_SetPaused(SoundChannel,true);
end;

A na závěr by měl každý programátor uklidit to, co si pootevíral:

procedure TForm1.FormDestroy(Sender: TObject);
begin
  FSOUND_Close();
end;
end.

Sami asi vidíte, že práce se zvukem na profesionální úrovni není vůbec složitá a zvládne ji i začátečník ;-)

Autoři tvrdí, že je FMOD nejrychlejší na světě (*THE* fastest mixing routines in the world.) a že je dvakrát rychlejší v mixování zvukových efektů, nežli Direct Sound s hardwarovou podporou !!! Mezi další vlastnosti patří podpora MMX instrukcí a podpora streamovaných dat (Voláním jediné funkce jemožné přehrát např mp3 nebo wma přes internet - místo jména souboru napíšete jeho URL adresu!!!). Zajímavé je také srovnání s jinými knihovnami (BASS, Midas, Seal, WinAMP, Galaxy Sound System). Měří se zatížení procesoru při přehrávání 8-bitových a 16-ti bitových dat a FMOD bezkonkurenčně vítězí ve všech testech(3% zatížení) - i když by se mohly vést polemiky o věrohodnosti, prožože se srovnání knihoven nachází přímo na stránkách fmod.org.

Pozn: Přehrávač, který jsem vytvořil by měl sloužit k přehrávání krátkých samplů. Nedoporučuji vkládat delší soubory, protože jejich načítání trvá velmi dlouho. K jejich přehrávání slouží druhá část knihovny FMOD - FMusic. Ta je určena pro přehrávání streamovaných dat.

No a to je vše! Zdroják je možno si stáhnout zde (8kB). Je, málem bych zapoměl uvést oficiální stránku - Můžete ji nalézt na adrese www.fmod.org.
EOF

Vyšlo 03.05.2002, v blogu: 0 1 2 3 4 5 6 7 8

Děkuji, že jste se rozhodl(a) přečíst tento článek. Budu rád i za komentář. Pokud Vás tento článek zaujal a rádi byste jej doporučili ostatním, podpořte mně prosím tím, že věnujete minutku svého času a uděláte mi reklamu na linkuj.cz, vybrali.sme.sk či jagg.cz. Přeji příjemné čtení

Poslední články

Diskuse k blogu

Zatím nikdo nevložil komentář. Chcete být první? Přidání příspěvku
©PC-guru.cz 2000-2008 | Optimalizováno pro 1024*768