Allegro - Midi a zvukové proudy (9. díl) - 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++

Allegro - Midi a zvukové proudy (9. díl)

8. března 2002, 00.00 | Dnešní díl nás seznamí s přehrávání MIDI souborů a tzv. zvukových proudů.

V minulém díle jsme se seznámili s přehrávání zvukových souborů typu WAV nebo VOC. Dnešní díl nám poví o tom zbytku. Což jsou zvukové proudy a především MIDI soubory.

Jako minule tak i dnes se lehce seznámíme se strukturou typu MIDI.

#define MIDI_TRACKS 32        /* able to handle this many */
typedef struct MIDI           /* a midi file */
{
   int divisions;             /* number of ticks per quarter note */
   struct {
      unsigned char *data;    /* MIDI message stream */
      int len;                /* length of the track data */
   } track[MIDI_TRACKS];
} MIDI;

která je 1) mnohem jednodušší než SAMPLE u WAVů a 2) má v sobě ještě jednu vnořenou strukturu nebo spíše pole struktur o 32 prvcích, které nám udávájí, že MIDI může mít max. 32 instrumentů. (tedy soudím čistě z toho co znám o MIDI, takže tuto informaci o instrumentech neberte úplně vážně)

Příklad na MIDI

#include "allegro.h"

int main(int argc, char *argv[])

   MIDI *the_music;

   allegro_init();

   if (argc != 2) {
      allegro_message("Pouziti: 'allegro8_2 jmeno_souboru.mid'\n");
      return 1;
   }

   install_keyboard();

   if(install_sound(DIGI_AUTODETECT,MIDI_AUTODETECT,argv[0])!= 0){
      allegro_message("Chyba pri inicializaci hudby\n%s\n",
                      allegro_error);
      return 1;
   }

   the_music = load_midi(argv[1]);
   if (!the_music) {
      allegro_message("Chyba pri nacitani '%s'\n", argv[1]);
      return 1;
   }

   play_midi(the_music, TRUE);

   readkey();

   destroy_midi(the_music);

   return 0;
}
END_OF_MAIN();

Jako první si opět vytvoříme zvuk. proměnnou, ale tentokrát typu pointer na strukturu MIDI a pojmenujeme se ji tak jako je tomu v ukázkovém souboru exmidi neboli the_music.

Při instalaci je potřeba jako druhý parametr dát MIDI_AUTODETECT, aby byla zajištěna instalace MIDI hudby.

Pro načtení ze souboru a naplnění struktury slouží podobná funkce jako v minulém článku a to 

MIDI *load_midi(const char *filename);

která jako parametr bere jméno souboru. V našem případě tedy parametr spustitelného souboru, kterým by měl být zvuk. soubor typu MIDI. Při chybě vrací NULL a pokud je vše v pořádku naplní strukturu MIDI ke které je tato funkce přiřazena. Opět se vyplatí raději provést kontrolu, ať už je málo paměti (i když to už se dnes nestává tak často) nebo pokud soubor je jiného formátu než má být.

Nyní už můžeme přehrávat soubor pomocí funkce 

int play_midi(MIDI *midi, int loop);

první parametr je pointer na strukturu MIDI a druhý je příznakový parametr, který má význam jako loop u funkce play_sample v minulém díle.

Pokud je tedy vlajka (příznakový parametr) nastaven na TRUE a my chceme hudbu zastavit můžeme použít funkci 

void stop_midi();

která nám veškerou hudbu zastaví.

A nakonec následuje uvolnění paměti pomocí funkce 

void destroy_midi(MIDI *midi);

Jako parametr si samozřejmě vyžádá již několikrát zmiňovanou strukturu MIDI nebo lépe pointer na strukturu.

AUDIO STREAM neboli zvukové proudy (prosím nemlaťte mě za ten překlad!)

Zde nedávám na ukázku přímo příklad, protože se domnívám, že tyto proudy nejsou už tolik používané a obohatit Vaši hru můžete pomocí MIDI nebo Wav souborů dostatečně. Přesto, ale něco málo ke čtyřem funkcím, které umožňují nějakým způsobem manipulovat s těmito soubory.

Popis se bude spíše podobat překladu manuálu plus něco navíc.

Struktura AUDIOSTREAM vypadá následovně:

struct SAMPLE;

typedef struct AUDIOSTREAM
{
   int voice;                /* the voice we are playing on */
   struct SAMPLE *samp;      /* the sample we are using */
   int len;                  /* buffer length */
   int bufcount;             /* number of buffers per sample half */
   int bufnum;               /* current refill buffer */
   int active;               /* which half is currently playing */
   void *locked;             /* the locked buffer */
} AUDIOSTREAM;

a má v sobě vnořenou strukturu SAMPLE. Tedy je zapotřebí opět si vytvořit proměnnou typu pointer na strukturu AUDIOSTREAM.

První funkce, kterou Vám nyní představím je:

AUDIOSTREAM *play_audio_stream(int len, bits, stereo, freq, vol, pan);

která vrací pointer na tuto strukturu. První parametr je velikost bufferu v paměti. Je to vlastně délka nebo doba hrajícího zvuku. Buffer je potřeba aktualizovat a dodávat mu další data, aby měl co hrát. Velikost se při programování pohybuje okolo 1k , což doporučují autoři Allegra. bits může nabývat hodnoty 8 nebo 16 a znamená to kolika bitový bude zvuk. stereo je vlajka, která nám signalizuje zda se má vytvořit buffer stereo či mono. S posledními parametry jsme se už setkali u funkce play_sample, která je asi nejpoužívanější (teda, alespoň u mě).

void stop_audio_stream(AUDIOSTREAM *stream);

Tato funkce uvolní paměť a zastaví "přehrávání" hudby.

void *get_audio_stream_buffer(AUDIOSTREAM *stream);

Pomocí této funkce aktualizujete data v bufferu, aby mohla hudba hrát dále. Čím menší je len u funkce play_audio_stream tím častěji musíte volat tuto funkci. Vrací NULL pokud jsou v paměti ještě neodehraná data. Pokud odehrání dat v bufferu, které můžete naplnit jakýmkoliv způsobem, ale nejlepší je asi použít funkci fread, je potřeba buffer uvolnit pro další data pomocí funkce free_autio_stream.

void free_audio_stream_buffer(AUDIOSTREAM *stream);

Uvolní již zmiňovaná data. Volá se po funkci get_audio_stream když vrátí nenulovou adresu na data a indikuje, že je nově alokovaný blok dat připraven k přehrávání.

Pro úplné pochopení zvukových proudů doporučuji si prostudovat příklad v Allegru, který vystupuje pod jménem exstream a k MIDI exmidi v podadresáři examples v Allegru.

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: