Poznßmka: P°edpoklßdß se mφrn∞ pokroΦilß znalost prßce se systΘmem Linux...
ProΦ plugin?
XMMS je velmi roz╣φ°en² p°ehrßvaΦ multimΘdiφ, o tom nenφ pochyb. Mezi u╛ivateli tohoto p°ehrßvaΦe se ale urΦit∞ najde nejeden, kter² mß pot°ebu upravit si v²stupnφ zvuk podle sebe, tak jak to zrovna pot°ebuje. TakovΘmu u╛ivateli nezbude nic jinΘho, ne╛ pou╛φt efektov² plugin. Mß dv∞ mo╛nosti: internet a napsat si ho sßm. Prvnφ mo╛nost je nejΦast∞j╣φ, ale mnoho kvalitnφch plugin∙ na internetu nenφ. Druh² zp∙sob je sice nßroΦn∞j╣φ, ale pokud jste dost ╣ikovnφ a zvuku a jeho zpracovßnφ rozumφte, urΦit∞ to nebude (zvlß╣╗ s tφmto nßvodem) velik² problΘm. Napsat si sv∙j plugin ale m∙╛e zkusit ka╛d², komu se to zdß zajφmavΘ a chce si to vyzkou╣et...
Co k tomu pot°ebujete?
Vlastn∞ nic moc. StaΦφ mφt nainstalovßno XMMS a jeho knihovny. Pokud jste si XMMS zkompilovali a nainstalovali sami, s knihovnami nebude problΘm. Pokud mßte XMMS nainstalovßno z balφΦik∙ (nap°. RPM), pak si ov∞°te, zda je nainstalovßn i xmms-devel balφΦek, pop°φpad∞ jej doinstalujte. V adresß°i s knihovnami (v RedHatu nap°. /usr/includes/) by m∞l b²t adresß° XMMS a v n∞m .h soubry. Pokud by n∞co nefungovalo, a soubory i adresß° existovaly, m∙╛ete zkusit tyto soubory nakopφrovat do adresß°e se zdrojov²m k≤dem.
A te∩ m∙╛eme zaΦφt.
V╣echny pluginy jsou ve skuteΦnosti knihovny. Obsahujφ funkce a struktury, podle kter²ch XMMS poznß, o jak² plugin jde (jist∞ jste post°ehli, ╛e jsou efektovΘ, vizualizaΦnφ, vstupnφ, v²stupnφ...) a podle toho jej za°adφ na sprßvnΘ mφsto v panelu "Nastavenφ". XMMS rovn∞╛ p°edpoklßdß, ╛e se uvnit° nachßzφ n∞kterΘ funkce, kterΘ toto roz╣katulkovßnφ umo╛nφ a zprost°edkujφ ovlßdßnφ a posφlßnφ dat, kterß majφ b²t nap°φklad n∞jak²m zp∙sobem upravena. Na nßsledujφcφm velmi jednoduchΘm pluginu se te∩ pokusφm popsat, jak takov² plugin psßt.
Zabalen² zdrojov² k≤d spolu s knihovnami si m∙╛ete stßhnout zde.
Soubor staΦφ rozbalit a pomocφ p°φkazu make jej zkompilujete.
A te∩ m∙╛eme zaΦφt.
K tomu, aby XMMS v∞d∞l, ╛e je v knihovn∞ ulo╛en plugin a ╛e je efektov², slou╛φ dv∞ Φßsti: mno╛ina funkcφ, kterΘ jsou p°φstupnΘ a funkce vracejφcφ odkaz na plugin. V na╣em jednoduchΘm pluginu vypadß takto:
/* nutne pro inicializaci v XMMS */
Pokud n∞jakou funkci nß╣ plugin mφt nebude (nap°φklad configure), napφ╣eme do seznamu na p°φslu╣nΘ mφsto
EffectPlugin ep = {
NULL, /* prirazuje XMMS */
NULL, /* prirazuje XMMS */
"Stereo Plugin (ChipCD)", /* popis v dialogu Nastaveni */
init, /* fukce volana pri startu */
cleanup, /* funkce volana pri ukoncovani */
about, /* funkce volana pri stisku tlac. O Pluginu */
configure, /* funkce volana pri stisku tlac. Konfigurovat */
mod_samples, /* funkce provadejici upravu vystupniho zvuku */
NULL
};
/* funkce vracejici odkaz na plugin */
EffectPlugin *get_eplugin_info(void){
return &ep;
}
NULL
. Je╣t∞ p°ed v²╣e uveden² k≤d napφ╣eme deklarace funkcφ, kterΘ v seznamu budou obsa╛eny, v p°φpad∞ na╣eho pluginu:
/* definice funkci */
Nynφ se p°istoupφ k napsßnφ v²╣e uveden²ch funkcφ. To, zda budou v pluginu obsa╛eny v╣echny, zßle╛φ na nßs (a na tom, co je napsßno v seznamu v²╣e). Nßsleduje k≤d funkcφ, kterΘ jsou v na╣em jednoduchΘm pluginu:
static void init(void);
static void cleanup(void);
static void about(void);
static void configure(void);
static int mod_samples(gpointer *d, gint length, AFormat afmt, gint srate, gint nch);
static void about(void){
Nynφ nßsleduje ta nejd∙le╛it∞j╣φ funkce, tedy ta, kterß modifikuje v²stupnφ data a zp∙sobφ tφm efekty. V parametrech je ukazatel na data, jejich dΘlku, formßt dat aj. a vracφ dΘlku pole dat. Data jsou ulo╛ena ve form∞ pole, p°iΦem╛ prvky na lichΘ/sudΘ pozici odpovφdajφ p°φslu╣nΘ stran∞ (levß/pravß) p°i stereu. POZOR! Tato funkce musφ vracet dΘllku dat (length) V«DY!
/* vypise info o pluginu po stisknuti */
/* tlacitka "O Pluginu" v XMMS */
printf("Stereo plugin (ChipCD): Pokusny plugin rubriky Linux z ChipCD :-)\n");
}
static void init(void){
/* pri nacteni pluginu do XMMS se provede tato funkce */
hodnota = 0.0;
stav = 0;
printf("Stereo plugin (ChipCD): XMMS me inicializovalo hodnotami 0.0(hodnota) a 0(stav).\n");
}
static void cleanup(void){
/* Pri vypnuti (korektnim) se provede tato funkce */
printf("Stereo plugin (ChipCD): XMMS konci, ja koncim taky.\n");
}
static void configure(void){
/* Pri stisknuti "Konfigurovat" se provede tato funkce */
/* Tato konkretni fce: hloupa rotace stavu */
stav++;
if(stav==1){ /* mono */
hodnota=1.0;
printf("Stereo plugin (ChipCD): Nastavuji MONO.\n");
}
if(stav==2){ /* stereo 2.0 */
hodnota=2.0;
printf("Stereo plugin (ChipCD): Nastavuji STEREO(2).\n");
}
if(stav==3){ /* stereo 2.5 */
hodnota=2.5;
printf("Stereo plugin (ChipCD): Nastavuji STEREO(2.5).\n");
stav=0; /* stav zpatky na zacatku */
}
}
Funkce ukßzkovΘho pluginu je pom∞rn∞ jednoduchß: Pokud se ud∞lß pr∙m∞r, zφskßme mono. Pokud z p∙vodnφ hodnoty (lichΘho i sudΘho) odeΦteme pr∙m∞r, zφskan² rozdφl (pro sudΘ i lichΘ prvky zvlß╣╗) je jednodu╣e °eΦeno to, co d∞lß stereo. Pokud tedy tento rozdφl k pr∙m∞ru p°iΦteme (pro sudΘ i lichΘ prvky), zφskßme p∙vodnφ stereo. Pokud rozdφl p°ed p°iΦtenφm nßsobφme a teprve pak p°iΦteme, efekt sterea se zv∞t╣φ. Vφce pochopφte urΦit∞ p°i pohledu na zdrojov² k≤d na╣eho jednoduchΘho pluginu:
/* funkce slouzici k uprave reprodukovane hudby */
Pak u╛ staΦφ jen plugin zkompilovat a soubor typu .so nahrßt t°eba do slo╛ky /home/XYZ/.xmms/Plugins (za XYZ si dosa∩te Vß╣ domovsk² adresß°) a spustit XMMS.
static int mod_samples(gpointer *d, gint length, AFormat afmt, gint srate, gint nch)
{
gint i;
double prumer, ldif, rdif, tmp, nasobek;
gint16 *data = (gint16 *)*d;
/* urceni formatu cisel - technicka vec - doporucuji */
if (!(afmt == FMT_S16_NE ||
(afmt == FMT_S16_LE && G_BYTE_ORDER == G_LITTLE_ENDIAN) ||
(afmt == FMT_S16_BE && G_BYTE_ORDER == G_BIG_ENDIAN)) ||
nch != 2)
return length;
nasobek = hodnota;
for (i = 0; i < length / 2; i += 2)
{
prumer = (data[i] + data[i + 1]) / 2;
ldif = data[i] - prumer;
rdif = data[i + 1] - prumer;
/* osetreni, zda hodnota neni prilis vysoka - pokud se neprovede */
/* XMMS muze spadnout - DOPORUCUJI */
tmp = prumer + (ldif * nasobek);
if (tmp < -32768)
tmp = -32768;
if (tmp > 32767)
tmp = 32767;
data[i] = tmp;
tmp = prumer + (rdif * nasobek);
if (tmp < -32768)
tmp = -32768;
if (tmp > 32767)
tmp = 32767;
data[i + 1] = tmp;
}
return length;
}
Pokud budete chtφt zkompilovat a vyzkou╣et
ukßzkov² plugin
, doporuΦuji pustit XMMS v terminßlu. Plugin toti╛ nepou╛φvß okna ale funkci printf(), jak jste si jist∞ v╣imli. Postup je pom∞rn∞ jednoduch²: Rozbalit archiv, napsat make, a pak u╛ staΦφ jen zkompilovan² plugin (.so soubor) ...