Að kanna Mediastreamer2 VoIP vélina. 2. hluti

Efni greinarinnar er tekið úr mínum zen rás.

Að kanna Mediastreamer2 VoIP vélina. 2. hluti

Að búa til tóngjafa

Í fyrri grein Við settum upp straumspilarasafnið, þróunarverkfæri og prófuðum virkni þeirra með því að smíða prufuforrit.

Í dag munum við búa til forrit sem getur búið til tónmerki á hljóðkorti. Til að leysa þetta vandamál þurfum við að tengja síurnar inn í hljóðgjafarásina sem sýnd er hér að neðan:

Að kanna Mediastreamer2 VoIP vélina. 2. hluti

Við lesum skýringarmyndina frá vinstri til hægri, þetta er sú átt sem gagnaflæðið okkar hreyfist í. Örvarnar benda líka til þess. Ferhyrningar gefa til kynna síur sem vinna úr gagnablokkum og gefa út niðurstöðuna. Inni í rétthyrningnum er hlutverk hans gefið til kynna og síugerðin með hástöfum rétt fyrir neðan. Örvarnar sem tengja ferhyrningana eru gagnaraðir þar sem gagnablokkir eru afhentir frá síu til síu. Almennt séð getur sía haft mörg inntak og úttak.

Þetta byrjar allt með klukkugjafanum, sem setur taktinn sem gögn eru reiknuð á í síunum. Samkvæmt klukkulotu sinni vinnur hver sía úr öllum gagnablokkum sem eru við inntak hennar. Og setur kubba með niðurstöðunni út í röðina. Fyrst framkvæmir sían sem er næst klukkugjafanum útreikninga, síðan eru síurnar tengdar útgangi hennar (það geta verið mörg úttak) og svo framvegis. Eftir að síðasta sían í keðjunni lýkur vinnslu hættir framkvæmdin þar til ný klukka kemur. Slög fylgja sjálfgefið 10 millisekúndna bili.

Snúum okkur aftur að skýringarmyndinni okkar. Klukkuloturnar koma að inntaki þagnargjafans; þetta er sía sem er upptekin við að búa til gagnablokk sem inniheldur núll við úttakið fyrir hverja klukkulotu. Ef við lítum á þennan blokk sem hljóðdæmi, þá er þetta ekkert annað en þögn. Við fyrstu sýn virðist það undarlegt að búa til gagnakubba með þögn - þegar öllu er á botninn hvolft heyrist það ekki, en þessar kubbar eru nauðsynlegar fyrir virkni hljóðmerkjagjafans. Rafallinn notar þessa kubba eins og autt blað og skráir hljóðsýni í þá. Í venjulegu ástandi er slökkt á rafalanum og sendir einfaldlega inntaksblokkir áfram til úttaksins. Þannig fara þagnarblokkir óbreyttar í gegnum alla hringrásina frá vinstri til hægri og enda í hljóðkortinu. Sem tekur hljóðlaust blokkir úr biðröðinni sem er tengdur inntakinu sínu.

En allt breytist ef rafallinn fær skipun um að spila hljóð, hann byrjar að búa til hljóðsýni og kemur þeim í staðinn fyrir samplingar í inntaksblokkunum og setur breyttu blokkina við úttakið. Hljóðkortið byrjar að spila hljóð. Hér að neðan er forrit sem útfærir vinnuáætlunina sem lýst er hér að ofan:

/* Файл 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);   
}

Eftir að hafa frumstillt fjölmiðlastrauminn eru þrjár síur búnar til: voidsource, dtmfgen, snd_card_write. Klukkugjafi er búinn til.

Þá þarftu að tengja síurnar í samræmi við hringrásina okkar og klukkugjafann verður að vera síðast tengdur, þar sem eftir þetta mun hringrásin strax byrja að starfa. Ef þú tengir klukkugjafa við ókláraða hringrás getur það gerst að fjölmiðlastraumurinn hrynji ef hann skynjar að minnsta kosti eina síu í keðjunni með öll inntak eða öll úttak "hangandi í loftinu" (ekki tengdur).

Að tengja síur er gert með því að nota aðgerðina

ms_filter_link(src, src_out, dst, dst_in)

þar sem fyrri röksemdin er bendi á upprunasíuna, þá er önnur rökin upprunaúttaksnúmerið (athugið að inntak og úttak eru númeruð frá núlli). Þriðja rökin er bendi á viðtakasíuna, sú fjórða er inntaksnúmer móttakara.

Allar síur eru tengdar og klukkugjafinn er síðast tengdur (hér eftir munum við einfaldlega kalla það ticker). Eftir það byrjar hljóðrásin okkar að virka, en ekkert heyrist í tölvuhátölurunum ennþá - slökkt er á hljóðgjafanum og fer einfaldlega í gegnum inntaksgagnablokkirnar með þögn. Til að byrja að búa til tón þarftu að keyra rafallsíuaðferðina.

Við munum búa til tveggja tóna (DTMF) merki sem samsvarar því að ýta á "1" hnappinn á símanum. Til að gera þetta notum við aðgerðina ms_filter_call_method() Við köllum MS_DTMF_GEN_PLAY aðferðina, sendum henni sem rökstuðningi bendi á kóðann sem spilunarmerkið ætti að samsvara.

Það eina sem er eftir er að setja saman forritið:

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

Og hlaupa:

$ ./mstest2

Eftir að forritið hefur verið ræst heyrist stutt hljóðmerki sem samanstendur af tveimur tónum í hátalara tölvunnar.

Við smíðuðum og settum af stað okkar fyrstu hljóðrás. Við sáum hvernig á að búa til síutilvik, hvernig á að tengja þau og hvernig á að kalla aðferðir þeirra. Þó að við séum ánægð með upphaflegan árangur þurfum við samt að huga að því að forritið okkar losar ekki úthlutað minni áður en það hættir. Í næsta grein við munum læra að þrífa upp eftir okkur.

Heimild: www.habr.com

Bæta við athugasemd