Pagsuhid sa Mediastreamer2 VoIP engine. Bahin 2

Ang materyal sa artikulo gikuha gikan sa akong zen channel.

Pagsuhid sa Mediastreamer2 VoIP engine. Bahin 2

Paghimo og Tone Generator

Sa miaging artikulo Gi-install namon ang librarya sa streamer sa media, mga himan sa pag-uswag ug gisulayan ang ilang pagpaandar pinaagi sa paghimo og usa ka pagsulay nga aplikasyon.

Karon maghimo kami usa ka aplikasyon nga makamugna og signal sa tono sa usa ka sound card. Aron masulbad kini nga problema kinahanglan natong ikonektar ang mga filter ngadto sa sound generator circuit nga gipakita sa ubos:

Pagsuhid sa Mediastreamer2 VoIP engine. Bahin 2

Gibasa namo ang diagram gikan sa wala ngadto sa tuo, kini ang direksyon diin ang among data flow nagalihok. Ang mga pana usab nagpaila niini. Ang mga rektanggulo nagpaila sa mga filter nga nagproseso sa mga bloke sa datos ug nagpagawas sa resulta. Sa sulod sa rectangle, ang papel niini gipakita ug ang tipo sa filter gipakita sa dagkong mga letra sa ubos. Ang mga pana nga nagkonektar sa mga rektanggulo mao ang mga pila sa datos diin ang mga bloke sa datos gihatod gikan sa filter ngadto sa filter. Sa kinatibuk-an, ang usa ka filter mahimong adunay daghang mga input ug output.

Nagsugod ang tanan sa gigikanan sa orasan, nga nagtakda sa tempo diin ang datos gikalkula sa mga pagsala. Sumala sa siklo sa orasan niini, ang matag filter nagproseso sa tanan nga mga bloke sa datos nga naa sa input niini. Ug gibutang ang mga bloke nga adunay resulta sa pila. Una, ang filter nga labing duol sa tinubdan sa orasan naghimo sa mga kalkulasyon, dayon ang mga filter nga konektado sa mga output niini (mahimo nga adunay daghang mga output), ug uban pa. Human mahuman ang pagproseso sa kataposang filter sa kadena, mohunong ang pagpatuman hangtod nga moabot ang bag-ong orasan. Ang mga beats, sa default, nagsunod sa usa ka interval nga 10 milliseconds.

Balik ta sa atong diagram. Ang mga siklo sa orasan moabot sa input sa tinubdan sa kahilom; kini usa ka filter, nga nagkapuliki sa paghimo og usa ka bloke sa datos nga adunay mga sero sa output niini alang sa matag siklo sa orasan. Kung atong isipon kini nga bloke isip usa ka bloke sa mga sound sample, nan kini walay lain kondili ang kahilom. Sa una nga pagtan-aw, daw katingad-an ang paghimo sa mga bloke sa datos nga adunay kahilom - pagkahuman, dili kini madungog, apan kini nga mga bloke gikinahanglan alang sa operasyon sa sound signal generator. Gigamit sa generator kini nga mga bloke sama sa usa ka blangko nga papel, nagrekord sa mga sampol sa tunog sa kanila. Sa normal nga kahimtang niini, ang generator gipalong ug gipasa lang ang mga bloke sa input sa output. Busa, ang mga bloke sa kahilom wala mausab sa tibuok sirkito gikan sa wala ngadto sa tuo, nga natapos sa sound card. Nga hilom nga gikuha ang mga bloke gikan sa pila nga konektado sa input niini.

Apan ang tanan mausab kung ang generator gihatagan og usa ka sugo sa pagpatukar sa tingog, kini nagsugod sa pagmugna og mga sound sample ug gipulihan kini og mga sample sa input blocks ug gibutang ang nausab nga mga bloke sa output. Ang sound card nagsugod sa pagpatugtog ug tingog. Sa ubos usa ka programa nga nagpatuman sa laraw sa trabaho nga gihulagway sa ibabaw:

/* Π€Π°ΠΉΠ» 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);   
}

Human sa pagsugod sa media streamer, tulo ka mga filter ang gihimo: voidsource, dtmfgen, snd_card_write. Nahimo ang tinubdan sa orasan.

Unya kinahanglan nimo nga ikonektar ang mga pagsala sumala sa among sirkito, ug ang gigikanan sa orasan kinahanglan nga konektado sa katapusan, tungod kay pagkahuman niini ang sirkito magsugod dayon sa pag-operate. Kon imong ikonektar ang tinubdan sa orasan ngadto sa wala pa mahuman nga sirkito, mahimong mahitabo nga ang media streamer nahagsa kon kini makamatikod ug labing menos usa ka filter sa kadena nga adunay tanang input o tanang output nga "nagbitay sa hangin" (dili konektado).

Ang pagkonektar sa mga filter gihimo gamit ang function

ms_filter_link(src, src_out, dst, dst_in)

diin ang unang argumento kay pointer sa source filter, ang ikaduhang argumento mao ang source output number (timan-i nga ang inputs ug outputs giihap sugod sa zero). Ang ikatulo nga argumento mao ang pointer sa receiver filter, ang ikaupat mao ang receiver input number.

Ang tanan nga mga pagsala konektado ug ang gigikanan sa orasan konektado sa katapusan (pagkatapos niini tawgon ra naton kini nga ticker). Pagkahuman niini ang among sound circuit nagsugod sa pagtrabaho, apan wala pa madungog sa mga speaker sa kompyuter - ang sound generator gipalong ug yano nga moagi sa mga bloke sa data sa input nga adunay kahilom. Sa pagsugod sa pagmugna og usa ka tono, kinahanglan nimo nga ipadagan ang generator filter nga pamaagi.

Maghimo kami og signal nga duha ka tono (DTMF) nga katumbas sa pagpindot sa "1" nga buton sa telepono. Aron mahimo kini, gigamit namon ang function ms_filter_call_method() Gitawag namon ang MS_DTMF_GEN_PLAY nga pamaagi, nga gipasa kini ingon usa ka argumento nga usa ka pointer sa code nga kinahanglan nga katumbas sa signal sa playback.

Ang nahabilin mao ang pag-compile sa programa:

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

Ug dagan:

$ ./mstest2

Human sa pagsugod sa programa, makadungog ka og mubo nga signal sa tingog nga naglangkob sa duha ka tono sa speaker sa kompyuter.

Among gitukod ug gilusad ang among unang sound circuit. Nakita namon kung giunsa paghimo ang mga pananglitan sa pagsala, kung giunsa kini pagkonektar ug kung giunsa pagtawag ang ilang mga pamaagi. Samtang nalipay kami sa among una nga kalampusan, kinahanglan gihapon namon nga hatagan pagtagad ang kamatuoran nga ang among programa wala magpagawas sa gigahin nga memorya sa dili pa mogawas. Sa sunod artikulo makakat-on kita sa paglimpyo sa atong kaugalingon.

Source: www.habr.com

Idugang sa usa ka comment