Binciko injin Mediastreamer2 VoIP. Kashi na 2

An ɗauko kayan labarin daga nawa zen channel.

Binciko injin Mediastreamer2 VoIP. Kashi na 2

Ƙirƙirar Tone Generator

A baya labarin Mun shigar da ɗakin karatu na kafofin watsa labaru, kayan aikin haɓakawa kuma mun gwada aikin su ta hanyar gina aikace-aikacen gwaji.

A yau za mu ƙirƙiri aikace-aikacen da zai iya samar da siginar sauti akan katin sauti. Don magance wannan matsalar muna buƙatar haɗa masu tacewa cikin da'irar janareta na sauti da aka nuna a ƙasa:

Binciko injin Mediastreamer2 VoIP. Kashi na 2

Muna karanta zane daga hagu zuwa dama, wannan ita ce hanyar da bayanan mu ke motsawa. Har ila yau, kiban suna nuna wannan. Rectangles suna nuna masu tacewa waɗanda ke aiwatar da tubalan bayanai kuma suna fitar da sakamakon. A cikin rectangle, ana nuna matsayinsa kuma ana nuna nau'in tacewa a cikin manyan haruffa a ƙasa. Kibiyoyin da ke haɗa rectangles jerin layi ne na bayanai waɗanda ta hanyar da ake sadar da tubalan bayanai daga tacewa zuwa tacewa. Gabaɗaya, tacewa na iya samun abubuwan shigar da abubuwa da yawa.

Duk yana farawa da tushen agogo, wanda ke saita lokacin da ake ƙididdige bayanai a cikin masu tacewa. Dangane da zagayowar agogon sa, kowace tace tana aiwatar da duk toshewar bayanan da ke cikin shigarta. Kuma yana sanya tubalan tare da sakamakon fita cikin jerin gwano. Na farko, matatar da ke kusa da tushen agogo tana yin lissafi, sannan matattarar da aka haɗa da abubuwan da aka fitar (ana iya samun abubuwan da yawa), da sauransu. Bayan tacewa ta ƙarshe a cikin sarkar ta gama aiki, aiwatarwa yana tsayawa har sai sabon agogo ya zo. Beats, ta tsohuwa, suna bin tazarar millise seconds 10.

Mu koma kan zanenmu. Zagayowar agogo suna isa wurin shigar da tushen shiru; wannan tacewa ne, wanda ke shagaltuwa da samar da katanga na bayanan da ke dauke da sifili a wurin fitar da shi na kowane zagayowar agogo. Idan muka yi la'akari da wannan toshe a matsayin toshe samfuran sauti, to wannan ba komai bane illa shiru. Da farko kallo, da alama m don samar da bayanai tubalan tare da shiru - bayan duk, ba za a iya ji, amma wadannan tubalan wajibi ne don aiki na sauti siginar janareta. Janareta yana amfani da waɗannan tubalan kamar takarda mara kyau, yana rikodin samfuran sauti a cikin su. A yanayin sa na yau da kullun, janareta yana kashe kuma yana tura tubalan shigarwa zuwa wurin fitarwa. Don haka, tubalan shuru suna wucewa ba su canzawa ta dukkan kewaye daga hagu zuwa dama, suna ƙarewa cikin katin sauti. Wanda a shiru yana ɗaukar tubalan daga layin da aka haɗa da shigar da shi.

Amma komai yana canzawa idan aka ba janareta umarni don kunna sauti, ya fara samar da samfuran sauti kuma ya maye gurbin su da samfurori a cikin tubalan shigarwa kuma ya sanya tubalan da aka canza a wurin fitarwa. Katin sauti yana fara kunna sauti. A ƙasa akwai shirin da ke aiwatar da tsarin aikin da aka kwatanta a sama:

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

Bayan ƙaddamar da rafi mai raɗaɗi, ana ƙirƙiri masu tacewa guda uku: voidsource, dtmfgen, snd_card_write. An ƙirƙiri tushen agogo.

Sannan kuna buƙatar haɗa masu tacewa daidai da kewayenmu, kuma dole ne a haɗa tushen agogo a ƙarshe, tunda bayan wannan kewayawar za ta fara aiki nan da nan. Idan kun haɗa tushen agogo zuwa da'irar da ba a gama ba, yana iya faruwa cewa mai ratsawa na kafofin watsa labarai ya faɗo idan ya gano aƙalla tacewa ɗaya a cikin sarkar tare da duk abubuwan da aka shigar ko duk abubuwan da ke rataye a cikin iska (ba a haɗa su ba).

Ana yin haɗin matattara ta amfani da aikin

ms_filter_link(src, src_out, dst, dst_in)

inda hujja ta farko ta kasance mai nuni ga matatar tushe, hujja ta biyu ita ce lambar fitarwa ta tushe (a kula cewa ana ƙididdige abubuwan shigarwa da abubuwan da aka fara daga sifili). Hujja ta uku ita ce mai nuni ga tace mai karba, na hudu shine lambar shigar da mai karba.

An haɗa duk masu tacewa kuma an haɗa tushen agogo a ƙarshe (nan gaba za mu kira shi kawai alamar). Bayan haka da'irar sautinmu ta fara aiki, amma ba za a iya jin komai a cikin lasifikan kwamfuta ba tukuna - ana kashe janareta na sauti kuma kawai ya wuce ta hanyar bayanan shigarwa tare da shiru. Don fara samar da sautin, kuna buƙatar gudanar da hanyar tace janareta.

Za mu samar da sigina mai sautin biyu (DTMF) daidai da latsa maɓallin "1" akan wayar. Don yin wannan, muna amfani da aikin ms_tace_hanyar_kira() Muna kiran hanyar MS_DTMF_GEN_PLAY, muna ba da ita azaman hujja mai nuni ga lambar da siginar sake kunnawa ya dace da ita.

Abin da ya rage shi ne hada shirin:

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

Kuma gudu:

$ ./mstest2

Bayan fara shirin, za ku ji gajeriyar siginar sauti mai kunshe da sautuna biyu a cikin lasifikar kwamfuta.

Mun gina kuma muka ƙaddamar da zagayowar sauti na farko. Mun ga yadda ake ƙirƙira misalan tacewa, yadda ake haɗa su da yadda ake kiran hanyoyin su. Duk da yake muna farin ciki da nasarar da muka samu na farko, har yanzu muna buƙatar kula da gaskiyar cewa shirinmu ba ya ƙyale ƙwaƙwalwar ajiyar da aka keɓe kafin fita. A gaba labarin za mu koyi tsaftace kanmu.

source: www.habr.com

Add a comment