[Grafika] [WebTip] [Fotografování] [Galerie] [MujMac] [Printing]
  Redakce: info (at) builder.cz   Inzerce: reklama (at) grafika.cz
Diskuzní fóra
.Net (68471)
ASP (1591)
ActiveX (168)
Allegro (136)
Assembler (3926)
C++ Builder (23160)
C/C++ (44499)
Databáze (30680)
Delphi (78808)
DelphiX (1655)
DirectX (1464)
Java (39508)
JavaScript (12598)
Matematické programy (2178)
OOP a UML (732)
OpenGL (6920)
Php (65224)
PowerBuilder (464)
Problémy a algoritmy (10473)
Programování v Linuxu (2000)
Právo a programování (3384)
Python (1353)
Ruby (136)
Visual Basic (12078)
Visual C++ (12956)
Wap (56)
Web (10895)
Web servery (5549)
Win32 (13553)
Windows CE (865)
XML/XSL (1860)
Textová inzerce
Služby Builder.cz
  • Bazar - koupím(0)
  • Bazar - prodám(0)
  • Hledám práci(0)
  • Nabízíme práci(0)
  • Projekty(0)
  • SDL_mixer - zvuky a hudba jednoduše a snadno
    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
    Předchozí díl: Mandelbrotova množina a jak na ní

    Autor: František Jahoda
    Rubrika: C/C++
    Publikováno: 11.03. 2003
     Tisk článku
    Poslat odkaz emailem
     

    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.


    Zpět na začátek stránky

    Autor: František Jahoda
    Klikni pro další články autora

    Hodnocení článku
    1 | 2 | 3 | 4 | 5
    Aktuální známka: 2.68
    (Počet známek: 9535)

    Komentáře k článku
    303ik04.06.11:57Einfach
    Scary08.01.11:41Knihovny
    AtheIste19.07.23:50RE: Knihovny
    dejaVu03.10.12:02Profi sound
    A-moniak04.06.22:43RE: Profi sound
         





    info@builder.cz
    Vydává Grafika Publishing, s.r.o.
    Copyright (c) 1997-2002 Všechna práva vyhrazena