Vekolîna motora VoIP ya Mediastreamer2. Beş 2

Madeya gotarê ji min hatiye girtin kanala zen.

Vekolîna motora VoIP ya Mediastreamer2. Beş 2

Afirandina Tone Generator

Di berê de gotara Me pirtûkxaneya weşana medyayê, amûrên pêşkeftinê saz kir û bi avakirina serîlêdanek ceribandinê re fonksiyona wan ceriband.

Îro em ê serîlêdanek biafirînin ku dikare li ser qerta dengek sînyalek dengek çêbike. Ji bo çareserkirina vê pirsgirêkê divê em fîlteran bi çerxa hilberînerê deng ku li jêr tê xuyang kirin ve girêdin:

Vekolîna motora VoIP ya Mediastreamer2. Beş 2

Em diagramê ji çepê ber bi rastê dixwînin, ev rêgez e ku herikîna daneya me tê de dimeşe. Tîr jî vê yekê nîşan dide. Rectangles fîlterên ku blokên daneyan hildiweşîne û encamê derdixe destnîşan dike. Di hundurê çargoşeyê de, rola wê tê destnîşan kirin û celebê parzûnê tenê li jêr bi tîpên mezin tê destnîşan kirin. Tîrên ku çargoşeyan bi hev ve girêdidin rêzên daneyê ne ku bi nav wan blokên daneyan ji parzûnê berbi parzûnê ve têne şandin. Bi gelemperî, parzûnek dikare gelek ketin û derketinan hebe.

Hemî bi çavkaniya demjimêrê dest pê dike, ya ku tempoya ku dane di parzûnan de têne hesibandin destnîşan dike. Li gorî çerxa demjimêra xwe, her parzûnek hemî blokên daneyê yên ku di têketina wê de ne pêvajoyê dike. Û blokên bi encam re dixe nav rêzê. Pêşîn, parzûna herî nêzê çavkaniya demjimêrê hesaban dike, dûv re fîlterên ku bi derketinên wê ve girêdayî ne (dibe ku gelek derketin hebin), û hwd. Piştî ku parzûna paşîn a di zincîrê de pêvajoyê biqedîne, darvekirin heya ku demjimêrek nû tê raweste. Lêdan, ji hêla xwerû, navberek 10 milîsaniyeyan dişopîne.

Ka em vegerin ser diyagrama xwe. Dewreyên demjimêrê digihîjin têketina çavkaniya bêdengiyê; ev parzûnek e, ku ji bo her çerxa demjimêrê bloka daneyê ku di derana xwe de sifir vedihewîne, mijûl e. Ger em vê blokê wekî blokek nimûneyên dengan bihesibînin, wê hingê ev ji bêdengiyê pê ve ne tiştek din e. Di nihêrîna pêşîn de, ecêb xuya dike ku meriv blokên daneyê bi bêdengiyê biafirîne - her tiştî, ew nayê bihîstin, lê ev blokan ji bo xebata hilberînerê nîşana deng hewce ne. Generator van blokan mîna kaxezek vala bikar tîne, nimûneyên deng di wan de tomar dike. Di rewşa xweya normal de, jenerator tê girtin û bi tenê blokên têketinê ber bi derketinê ve dişîne. Bi vî rengî, blokên bêdengiyê ji çepê ber bi rastê ve bêguhêr di nav tevahiyê de derbas dibin, di qerta deng de diqedin. Ku bi bêdengî blokan ji rêza ku bi têketina xwe ve girêdayî ye digire.

Lê her tişt diguhere ger fermana lêxistina deng ji jeneratorê re were dayîn, ew dest bi çêkirina nimûneyên deng dike û di blokên têketinê de nimûneyên wan diguhezîne û blokên guhertî datîne dergehê. Karta deng dest bi lêxistina deng dike. Li jêr bernameyek e ku nexşeya xebatê ya ku li jor hatî diyar kirin bicîh tîne:

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

Piştî destpêkirina weşana medyayê, sê fîlter têne afirandin: voidsource, dtmfgen, snd_card_write. Çavkaniyeke saetê tê çêkirin.

Dûv re hûn hewce ne ku fîlteran li gorî çerxa me ve girêdin, û çavkaniya demjimêrê divê paşîn were girêdan, ji ber ku piştî vê yekê dor dê tavilê dest bi xebatê bike. Ger hûn çavkaniyek demjimêrê bi dorhêlek neqediyayî ve girêdin, dibe ku biqewime ku weşana medyayê têk biçe ger ew bi kêmî ve parzûnek di zincîrê de bi hemî têketin an hemî derketinên "li hewayê daleqandî" (ne girêdayî) vedîtîne.

Girêdana fîlteran bi karanîna fonksiyonê pêk tê

ms_filter_link(src, src_out, dst, dst_in)

li cihê ku argumana yekem nîşana parzûna çavkaniyê ye, argûmana duyemîn jimareya derana çavkaniyê ye (bala xwe bidin ku ketin û derketin ji sifirê dest pê dikin têne hejmartin). Argumana sêyemîn nîşanek ji parzûna wergir e, ya çaremîn jî hejmara têketina wergir e.

Hemî fîlter bi hev ve girêdayî ne û çavkaniya demjimêrê ya paşîn ve girêdayî ye (li vir şûnda em ê bi tenê jê re binavkirî bibêjin). Piştî vê yekê dora meya dengê me dest bi xebatê dike, lê hîn tiştek di axaftvanên komputerê de nayê bihîstin - hilberînerê deng tê girtin û bi tenê di nav blokên daneya têketinê de bi bêdengî re derbas dibe. Ji bo ku hûn dest bi hilberîna dengek bikin, hûn hewce ne ku rêbaza parzûna jeneratorê bimeşînin.

Em ê îşaretek du-ton (DTMF) bi tikandina bişkoja "1" ya li ser têlefonê re çê bikin. Ji bo vê yekê, em fonksiyonê bikar tînin ms_filter_call_method() Em ji rêbaza MS_DTMF_GEN_PLAY re dibêjin, wê wekî argûmanek nîşanek koda ku divê sînyala leyiztinê pê re têkildar be derbas bike.

Tiştê ku dimîne berhevkirina bernameyê ye:

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

Û birevin:

$ ./mstest2

Piştî destpêkirina bernameyê, hûn ê di dengbêja komputerê de îşaretek dengek kurt a ku ji du dengan pêk tê bibihîzin.

Me çerxa dengê xwe yê yekem ava kir û da destpêkirin. Me dît ku meriv çawa mînakên fîlterê diafirîne, meriv wan çawa vedigire û meriv çawa bangî rêbazên wan dike. Dema ku em ji serkeftina xweya destpêkê kêfxweş in, em hîn jî hewce ne ku bala xwe bidin vê yekê ku bernameya me berî ku derkeve bîra veqetandî azad nake. Di paşerojê de gotara em ê hînî paqijkirina piştî xwe bibin.

Source: www.habr.com

Add a comment