Prozkoumání enginu Mediastreamer2 VoIP. Část 2

Materiál článku je převzat z mého zenový kanál.

Prozkoumání enginu Mediastreamer2 VoIP. Část 2

Vytvoření generátoru tónů

V předchozím článek Nainstalovali jsme knihovnu pro streamování médií a vývojové nástroje a otestovali jejich funkčnost vytvořením ukázkové aplikace.

Dnes si vytvoříme aplikaci, která dokáže vydávat tónový signál na zvukové kartě. Abychom tento problém vyřešili, budeme muset do níže uvedeného obvodu generátoru zvuku zapojit filtry:

Prozkoumání enginu Mediastreamer2 VoIP. Část 2

Čtěte diagram zleva doprava – to je směr toku dat. Šipky to také naznačují. Obdélníky představují filtry, které zpracovávají datové bloky a vydávají výsledky. Uvnitř každého obdélníku je jeho role a pod ní je velkými písmeny uveden typ filtru. Šipky spojující obdélníky představují datové fronty, které předávají datové bloky z filtru do filtru. Filtr může mít obecně více vstupů a výstupů.

Všechno začíná zdrojem hodin, který určuje tempo zpracování dat ve filtrech. V čase zpracování hodin každý filtr zpracovává všechny bloky dat na svém vstupu a výsledné bloky umisťuje na výstup – do fronty. Filtr nejblíže zdroji hodin provádí zpracování jako první, následovaný filtry připojenými k jeho výstupům (může existovat více výstupů) atd. Po dokončení zpracování posledním filtrem v řetězci se provádění zastaví, dokud nejsou přijaty nové hodiny. Ve výchozím nastavení se hodiny zpracovávají v 10milisekundových intervalech.

Vraťme se k našemu obvodu. Na vstup zdroje ticha přicházejí hodiny. Tento filtr generuje pro každé hodiny datový blok obsahující na výstupu nuly. Pokud tento blok považujeme za blok audio vzorků, pak se nejedná o nic jiného než o ticho. Na první pohled se zdá zvláštní generovat datové bloky obsahující ticho – koneckonců ho nelze slyšet – ale tyto bloky jsou nezbytné pro provoz generátoru audio signálu. Generátor tyto bloky používá jako prázdný list papíru a nahrává do nich audio vzorky. V normálním stavu je generátor vypnutý a jednoduše předává vstupní bloky na výstup. Tiché bloky tak procházejí beze změny celým obvodem zleva doprava a dorazí ke zvukové kartě, která tiše bere bloky z fronty připojené k jejímu vstupu.

Všechno se ale změní, když generátor dostane příkaz k přehrání zvuku. Začne generovat zvukové vzorky, nahrazuje jimi vzorky ve vstupních blocích a vydává upravené bloky. Zvuková karta začne přehrávat zvuk. Níže je uveden program, který implementuje výše popsané schéma:

/* Файл 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 inicializaci mediálního streameru se vytvoří tři filtry: voidsource, dtmfgen, snd_card_writeVytvoří se zdroj hodinového signálu.

Dále zapojte filtry podle našeho schématu, přičemž zdroj hodin je připojen jako poslední, protože obvod začne fungovat ihned poté. Pokud připojíte zdroj hodin k nedokončenému obvodu, může dojít k selhání streameru médií, pokud detekuje byť jen jeden filtr v řetězci se všemi vstupy nebo výstupy „plovoucími“ (nepřipojenými).

Připojení filtrů se provádí pomocí funkce

ms_filter_link(src, src_out, dst, dst_in)

kde první argument je ukazatel na zdrojový filtr, druhý argument je číslo zdrojového výstupu (všimněte si, že vstupy a výstupy jsou číslovány od nuly). Třetí argument je ukazatel na cílový filtr a čtvrtý argument je číslo cílového vstupu.

Všechny filtry jsou připojeny a zdroj hodin (dále jen ticker) je připojen jako poslední. Poté se spustí náš audio obvod, ale v reproduktoru počítače zatím nic není slyšet – audio generátor je vypnutý a jednoduše prochází vstupními datovými bloky s tichem. Pro zahájení generování tónu musíme spustit filtrovací metodu generátoru.

Vygenerujeme dvoutónový (DTMF) signál odpovídající stisknutí tlačítka „1“ na telefonu. K tomu použijeme funkci ms_filter_call_method() Voláme metodu MS_DTMF_GEN_PLAY a jako argument jí předáme ukazatel na kód, kterému by měl reprodukovaný signál odpovídat.

Zbývá už jen zkompilovat program:

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

A spusťte:

$ ./mstest2

Po spuštění programu uslyšíte v reproduktoru počítače krátké pípnutí složené ze dvou tónů.

Sestavili a spustili jsme náš první audio obvod. Viděli jsme, jak vytvářet instance filtrů, jak je propojovat a jak volat jejich metody. I když jsme s naším počátečním úspěchem spokojeni, musíme si stále dávat pozor na to, aby náš program před ukončením neuvolnil alokovanou paměť. V další části... článek Naučíme se po sobě uklízet.

Zdroj: www.habr.com

Kupte si spolehlivý hosting pro stránky s DDoS ochranou, VPS VDS servery 🔥 Kupte si spolehlivý webhosting s ochranou DDoS, VPS VDS servery | ProHoster