Raziskovanje mehanizma VoIP Mediastreamer2. 2. del

Gradivo članka je vzeto iz mojega zen kanal.

Raziskovanje mehanizma VoIP Mediastreamer2. 2. del

Ustvarjanje tonskega generatorja

V prejšnjem članek Namestili smo knjižnico media streamer, razvojna orodja in preizkusili njihovo funkcionalnost z izdelavo preizkusne aplikacije.

Danes bomo ustvarili aplikacijo, ki lahko ustvari tonski signal na zvočni kartici. Za rešitev te težave moramo povezati filtre v vezje generatorja zvoka, prikazano spodaj:

Raziskovanje mehanizma VoIP Mediastreamer2. 2. del

Diagram beremo od leve proti desni, to je smer, v kateri se premika naš tok podatkov. Na to namigujejo tudi puščice. Pravokotniki označujejo filtre, ki obdelujejo bloke podatkov in izpišejo rezultat. Znotraj pravokotnika je označena njegova vloga in vrsta filtra je navedena z velikimi črkami tik spodaj. Puščice, ki povezujejo pravokotnike, so čakalne vrste podatkov, skozi katere se bloki podatkov prenašajo od filtra do filtra. Na splošno ima lahko filter veliko vhodov in izhodov.

Vse se začne z izvorom ure, ki nastavi tempo, pri katerem se podatki izračunajo v filtrih. V skladu s svojim taktom vsak filter obdela vse podatkovne bloke, ki so na njegovem vhodu. In postavi bloke z rezultatom v čakalno vrsto. Najprej filter, ki je najbližji izvoru ure, izvede izračune, nato filtri, povezani z njegovimi izhodi (izhodov je lahko veliko) in tako naprej. Ko zadnji filter v verigi konča obdelavo, se izvajanje ustavi, dokler ne prispe nova ura. Utripi privzeto sledijo intervalu 10 milisekund.

Vrnimo se k našemu diagramu. Urni cikli pridejo na vhod vira tišine; to je filter, ki je zaposlen z ustvarjanjem bloka podatkov, ki na svojem izhodu vsebuje ničle za vsak urni cikel. Če ta blok obravnavamo kot blok zvočnih vzorcev, potem to ni nič drugega kot tišina. Na prvi pogled se zdi nenavadno ustvarjanje podatkovnih blokov s tišino - navsezadnje se ne sliši, vendar so ti bloki potrebni za delovanje generatorja zvočnega signala. Generator te bloke uporablja kot prazen list papirja in vanje snema zvočne vzorce. V normalnem stanju je generator izklopljen in preprosto posreduje vhodne bloke na izhod. Tako gredo bloki tišine nespremenjeni skozi celotno vezje od leve proti desni in končajo v zvočni kartici. Ki tiho jemlje bloke iz čakalne vrste, povezane z njegovim vhodom.

Toda vse se spremeni, če dobi generator ukaz za predvajanje zvoka, začne generirati zvočne vzorce in jih zamenja z vzorci v vhodnih blokih ter spremenjene bloke postavi na izhod. Zvočna kartica začne predvajati zvok. Spodaj je program, ki izvaja zgoraj opisano shemo dela:

/* Файл mstest2.c */
#include <mediastreamer2/msfilter.h>
#include <mediastreamer2/msticker.h>
#include <mediastreamer2/dtmfgen.h>
#include <mediastreamer2/mssndcard.h>
int main()
{
    ms_init();

    /* Создаем экземпляры фильтров. */
    MSFilter  *voidsource = ms_filter_new(MS_VOID_SOURCE_ID);
    MSFilter  *dtmfgen = ms_filter_new(MS_DTMF_GEN_ID);
    MSSndCard *card_playback = ms_snd_card_manager_get_default_card(ms_snd_card_manager_get());
    MSFilter  *snd_card_write = ms_snd_card_create_writer(card_playback);

    /* Создаем тикер. */
    MSTicker *ticker = ms_ticker_new();

    /* Соединяем фильтры в цепочку. */
    ms_filter_link(voidsource, 0, dtmfgen, 0);
    ms_filter_link(dtmfgen, 0, snd_card_write, 0);

   /* Подключаем источник тактов. */
   ms_ticker_attach(ticker, voidsource);

   /* Включаем звуковой генератор. */
   char key='1';
   ms_filter_call_method(dtmfgen, MS_DTMF_GEN_PLAY, (void*)&key);

   /* Даем, время, чтобы все блоки данных были получены звуковой картой.*/
   ms_sleep(2);   
}

Po inicializaciji medijskega pretakalnika se ustvarijo trije filtri: voidsource, dtmfgen, snd_card_write. Ustvarjen je izvor ure.

Nato morate povezati filtre v skladu z našim vezjem, vir ure pa mora biti priključen zadnji, saj bo po tem vezje takoj začelo delovati. Če vir takta povežete z nedokončanim vezjem, se lahko zgodi, da se medijski streamer zruši, če zazna vsaj en filter v verigi z vsemi vhodi ali izhodi, ki "visijo v zraku" (niso povezani).

Priključitev filtrov se izvede s funkcijo

ms_filter_link(src, src_out, dst, dst_in)

kjer je prvi argument kazalec na izvorni filter, je drugi argument izvorna izhodna številka (upoštevajte, da so vhodi in izhodi oštevilčeni od nič). Tretji argument je kazalec na filter sprejemnika, četrti je vhodna številka sprejemnika.

Priključijo se vsi filtri, nazadnje pa se priključi vir takta (v nadaljevanju ga bomo preprosto imenovali ticker). Po tem začne naše zvočno vezje delovati, vendar v zvočnikih računalnika še ni slišati ničesar - generator zvoka je izklopljen in preprosto prehaja skozi vhodne podatkovne bloke s tišino. Če želite začeti generirati ton, morate zagnati metodo filtra generatorja.

Ustvarili bomo dvotonski (DTMF) signal, ki ustreza pritisku gumba "1" na telefonu. Za to uporabimo funkcijo ms_filter_call_method() Metodo MS_DTMF_GEN_PLAY pokličemo in ji kot argument posredujemo kazalec na kodo, ki ji mora ustrezati predvajalni signal.

Vse kar ostane je sestaviti program:

$ gcc mstest2.c -o mstest2 `pkg-config mediastreamer --libs --cflags`

In teči:

$ ./mstest2

Po zagonu programa boste v zvočniku računalnika zaslišali kratek zvočni signal, sestavljen iz dveh tonov.

Zgradili in lansirali smo naše prvo zvočno vezje. Videli smo, kako ustvariti primerke filtrov, kako jih povezati in kako poklicati njihove metode. Čeprav smo zadovoljni z našim začetnim uspehom, moramo še vedno paziti na dejstvo, da naš program pred izstopom ne sprosti dodeljenega pomnilnika. V naslednjem članek naučili se bomo pospravljati za seboj.

Vir: www.habr.com

Dodaj komentar