Po studiojmë motorin VoIP Mediastreamer2. Pjesa 2

Materiali i artikujt është marrë nga kanali im Dzen.

Po studiojmë motorin VoIP Mediastreamer2. Pjesa 2

Krijojmë një gjenerues tonal

Në artikulli ynë Ne kemi përfunduar instalimin e bibliotekës së media streaming, veglave të zhvillimit dhe kemi verifikuar funksionimin e tyre duke mbledhur një aplikacion provë.

Sot do të krijojmë një aplikacion që do të jetë në gjendje të gjenerojë një sinjal tonal në hartën tonale. Për të zgjidhur këtë detyrë, na nevojitet të lidhim filtrat në diagramin e treguar më poshtë të gjeneruesit tonale:

Po studiojmë motorin VoIP Mediastreamer2. Pjesa 2

Lexojmë diagramin nga e majta në të djathtë, pikërisht në këtë drejtim lëviz fluksi i të dhënave. Të gishtat gjithashtu sugjerojnë këtë. Drejtëkëndëshat tregojnë filtrat që përpunojnë blloqet e të dhënave dhe japin rezultatin në dalje. Brenda çdo drejtëkëndëshi tregohet roli i tij dhe pak më poshtë me shkronja të mëdha tregohet tipi i filtrit. Të gishtat që lidhin drejtëkëndëshat, janë radhë të të dhënave me të cilat blloqet e të dhënave dërgohen nga filtri në filtru. Në përgjithësi, çdo filtr mund të ketë shumë hyrje dhe dalje.

Çdo gjë fillon me burimin e taktim, i cili përcakton tempin në të cilin ndodh përpunimi i të dhënave në filtrat. Në taktin e tij, çdo filtr përpunon të gjitha blloqet e të dhënave që ka në hyrje. Ai dërgon blloqet me rezultatin në dalje — në radhë. Fillimisht, përpunimi kryhet nga filtrat më të afërt me burimin e taktim, pastaj filtrat e lidhur me daljet e tij (mund të ketë shumë dalje) dhe kështu me radhë. Pasi filtrat e fundit në zinxhir të përfundojnë përpunimi, ekzekutimi ndalon derisa të vijë një taktim i ri. Takti, për default, ndjek me një interval prej 10 milisekondash.

Kthemi në skemën tonë. Takti hyn në burimin e heshtjes, që është një filtr që çdo takt gjeneron në daljen e tij një grup të dhënash që përmban zero. Nëse e shikojmë këtë grup si një grup të dhënash audio, nuk është tjetër veçse heshtje. Në shikim të parë, duket e çuditshme të gjenerosh grupe të dhënash me heshtje — pasi që nuk mund ta dëgjosh, por këto grupe janë të nevojshme për funksionimin e gjeneratorit të sinjalit audio. Gjeneratori e përdor këtë grup si një fletë të bardhë, duke e regjistruar në të përgjigjet audio. Në gjendjen e tij normale, gjeneratori është i fikur dhe thjesht kalaon grupet e hyrjes në dalje. Kështu, grupet e heshtjes kalojnë pa ndryshim nëpër të gjithë skemën nga e majta në të djathtë, duke shkuar në kartën audio. E cila merr grupet nga radhët e lidhura me hyrjen e saj, pa zë.

Por gjithçka ndodh ndryshon nëse i jepet gjeneratorit një urdhër për të luajtur zërin, ai fillon të gjenerojë përgjigje audio dhe i zëvendëson ato në grupet e hyrjes dhe i vendos grupet e ndryshuara në dalje. Karta audio fillon të luajë zërin. Më poshtë jepet një program që realizon skemën e punës të përshkruar më sipër:

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

Pas inicializimit të mediastreamerit, krijohen tre filtra: voidsource, dtmfgen, snd_card_write. Krijohet një burim takti.

Më pas, duhet të kryhet lidhja e filtrave sipas skemës sonë, ku burimi i taktikës duhet të lidhet i fundit, sepse pas kësaj do të fillojë menjëherë puna e skemës. Nëse lidhet burimi i taktikës në një skemë të papërfunduar, mund të ndodhë që mediastreamer të mbyllet papritur, nëse zbulon në zinxhir edhe një filtër të cilin të gjitha hyrjet ose të gjitha daljet "janë në ajër" (të pa lidhura).

Lidhja e filtrave kryhet me anë të funksionit

ms_filter_link(src, src_out, dst, dst_in)

ku argumenti i parë është një tregues për filtrin burim, argumenti i dytë — numri i daljes së burimit (vini re se hyrjet dhe daljet numërohen duke filluar nga zero). Argumenti i tretë është një tregues për filtrin pranues, i katërti — numri i hyrjes së pranuesit.

Të gjitha filtrat janë të lidhur dhe burimi i taktimeve (më poshtë do ta quajmë thjesht si ticker) përfshihet si i fundit. Pas kësaj, skema jonë audio fillon të punojë, por në dinamikën e kompjuterit nuk dëgjohet asgjë — gjeneratori i zërit është i ndezur dhe thjesht kalon përmes tij blloqet hyrëse të të dhënave me heshtje. Për të nisur gjenerimin e sinjalit tonalisht, është e nevojshme të zbatohet metoda e filtrit të gjeneratorit.

Ne do të gjenerojmë një sinjal dy-tonësh (DTMF) që i përgjigjet shtypjes së butonit "1" në telefon. Për këtë, do të përdorim funksionin ms_filter_call_method() për të thirrur metodën MS_DTMF_GEN_PLAY, duke i kaluar si argument një tregues në kodin që duhet të përputhet me sinjalin që po luhet.

Tani mbetet të kompilohet programi:

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

Dhe ta fillojmë:

$ ./mstest2

Pas nisjes së programit, do të dëgjoni një sinjal të shkurtër zëri në dinamikën e komputerit që përbëhet nga dy nota.

Ne kemi ndërtuar dhe aktivizuar skemën tonë të parë audio. Pamë si të krijojmë instancat e filtrave, si t'i lidhim dhe si të thërrasim metodat e tyre. Duke u gëzuar për suksesin e parë, megjithatë, na duhet të vëmë re se programi ynë nuk çliron memorjen e alokuar para përfundimit. Në të ardhmen artikulli ynë ne do të mësojmë të pastrojmë pas vetes.

Burimi: habr.com

Blini hosting të besueshëm për faqe interneti me mbrojtje nga DDoS, serverë VPS VDS 🔥 Blini hosting të besueshëm për faqe interneti me mbrojtje nga DDoS, serverë VPS VDS | ProHoster