Eksplorimi i motorit VoIP Mediastreamer2. Pjesa 2

Materiali i artikullit është marrë nga ime kanal zen.

Eksplorimi i motorit VoIP Mediastreamer2. Pjesa 2

Krijimi i një gjeneratori tonesh

Në të mëparshmen artikull Ne instaluam bibliotekën e transmetimit të mediave, mjetet e zhvillimit dhe testuam funksionalitetin e tyre duke ndërtuar një aplikacion provë.

Sot do të krijojmë një aplikacion që mund të gjenerojë një sinjal toni në një kartë zanore. Për të zgjidhur këtë problem, ne duhet të lidhim filtrat në qarkun e gjeneratorit të zërit të paraqitur më poshtë:

Eksplorimi i motorit VoIP Mediastreamer2. Pjesa 2

Ne lexojmë diagramin nga e majta në të djathtë, ky është drejtimi në të cilin lëviz rrjedha jonë e të dhënave. Shigjetat gjithashtu lënë të kuptohet për këtë. Drejtkëndëshat tregojnë filtra që përpunojnë blloqe të dhënash dhe nxjerrin rezultatin. Brenda drejtkëndëshit, roli i tij tregohet dhe lloji i filtrit tregohet me shkronja të mëdha pak më poshtë. Shigjetat që lidhin drejtkëndëshat janë radhë të dhënash përmes të cilave blloqet e të dhënave dorëzohen nga filtri në filtër. Në përgjithësi, një filtër mund të ketë shumë hyrje dhe dalje.

Gjithçka fillon me burimin e orës, i cili përcakton ritmin me të cilin llogariten të dhënat në filtra. Sipas ciklit të tij të orës, çdo filtër përpunon të gjitha blloqet e të dhënave që janë në hyrje të tij. Dhe vendos blloqe me rezultatin në radhë. Fillimisht, filtri më afër burimit të orës kryen llogaritjet, pastaj filtrat e lidhur me daljet e tij (mund të ketë shumë dalje) etj. Pasi filtri i fundit në zinxhir përfundon përpunimin, ekzekutimi ndalon derisa të arrijë një orë e re. Rrahjet, si parazgjedhje, ndjekin një interval prej 10 milisekondash.

Le të kthehemi në diagramin tonë. Ciklet e orës arrijnë në hyrjen e burimit të heshtjes; ky është një filtër, i cili është i zënë me gjenerimin e një blloku të dhënash që përmban zero në daljen e tij për çdo cikël orësh. Nëse e konsiderojmë këtë bllok si një bllok të mostrave të tingullit, atëherë kjo nuk është asgjë më shumë se heshtje. Në pamje të parë, duket e çuditshme të gjenerosh blloqe të dhënash me heshtje - në fund të fundit, nuk mund të dëgjohet, por këto blloqe janë të nevojshme për funksionimin e gjeneratorit të sinjalit të zërit. Gjeneratori i përdor këto blloqe si një fletë letre të zbrazët, duke regjistruar mostra tingulli në to. Në gjendjen e tij normale, gjeneratori fiket dhe thjesht i përcjell blloqet e hyrjes në dalje. Kështu, blloqet e heshtjes kalojnë të pandryshuara në të gjithë qarkun nga e majta në të djathtë, duke përfunduar në kartën e zërit. E cila merr në heshtje blloqe nga radha e lidhur me hyrjen e saj.

Por gjithçka ndryshon nëse gjeneratorit i jepet një komandë për të luajtur zërin, ai fillon të gjenerojë mostra tingulli dhe i zëvendëson ato me mostra në blloqet hyrëse dhe vendos blloqet e ndryshuara në dalje. Karta e zërit fillon të luajë zërin. Më poshtë është një program që zbaton 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ë transmetuesit të medias, krijohen tre filtra: voidsource, dtmfgen, snd_card_write. Është krijuar një burim i orës.

Pastaj ju duhet të lidhni filtrat në përputhje me qarkun tonë, dhe burimi i orës duhet të lidhet i fundit, pasi pas kësaj qarku do të fillojë menjëherë të funksionojë. Nëse lidhni një burim orë me një qark të papërfunduar, mund të ndodhë që transmetuesi i medias të rrëzohet nëse zbulon të paktën një filtër në zinxhir me të gjitha hyrjet ose të gjitha daljet "të varura në ajër" (jo të lidhur).

Lidhja e filtrave bëhet duke përdorur funksionin

ms_filter_link(src, src_out, dst, dst_in)

ku argumenti i parë është një tregues në filtrin e burimit, argumenti i dytë është 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 e marrësit, i katërti është numri i hyrjes së marrësit.

Të gjithë filtrat janë të lidhur dhe burimi i orës është i lidhur i fundit (në tekstin e mëtejmë do ta quajmë thjesht një tregues). Pas së cilës qarku ynë i zërit fillon të funksionojë, por asgjë nuk mund të dëgjohet ende në altoparlantët e kompjuterit - gjeneratori i zërit fiket dhe thjesht kalon nëpër blloqet e të dhënave hyrëse me heshtje. Për të filluar të gjeneroni një ton, duhet të përdorni metodën e filtrit të gjeneratorit.

Ne do të gjenerojmë një sinjal me dy ton (DTMF) që korrespondon me shtypjen e butonit "1" në telefon. Për ta bërë këtë, ne përdorim funksionin ms_filter_call_method() Ne e quajmë metodën MS_DTMF_GEN_PLAY, duke e kaluar atë si argument një tregues për kodin që duhet të korrespondojë sinjali i riprodhimit.

Gjithçka që mbetet është të përpiloni programin:

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

Dhe vraponi:

$ ./mstest2

Pas nisjes së programit, në altoparlantin e kompjuterit do të dëgjoni një sinjal të shkurtër zanor të përbërë nga dy tone.

Ne ndërtuam dhe lëshuam qarkun tonë të parë të zërit. Ne pamë se si të krijonim instanca filtri, si t'i lidhim ato dhe si t'i thërrasim metodat e tyre. Ndërsa jemi të kënaqur me suksesin tonë fillestar, duhet t'i kushtojmë vëmendje faktit që programi ynë nuk e çliron memorien e caktuar përpara se të dalë. Në tjetrën artikull do të mësojmë të pastrojmë veten.

Burimi: www.habr.com

Shto një koment