Ihlola injini ye-Mediastreamer2 VoIP. Ingxenye 2

Indaba ye-athikili ithathwe kweyami ishaneli zen.

Ihlola injini ye-Mediastreamer2 VoIP. Ingxenye 2

Ukudala i-Tone Generator

Kwedlule isihloko Sifake ilabhulali ye-media streamer, amathuluzi okuthuthukisa futhi sahlola ukusebenza kwawo ngokwakha uhlelo lokusebenza lwesilingo.

Namuhla sizodala uhlelo lokusebenza olungakhiqiza isignali yethoni ekhadini lomsindo. Ukuze sixazulule le nkinga sidinga ukuxhuma izihlungi kumjikelezo wejeneretha yomsindo oboniswe ngezansi:

Ihlola injini ye-Mediastreamer2 VoIP. Ingxenye 2

Sifunda umdwebo ukusuka kwesobunxele kuya kwesokudla, lesi isiqondiso lapho ukuhamba kwedatha yethu kuhamba khona. Imicibisholo nayo iyakusikisela lokhu. Onxande babonisa izihlungi ezicubungula amabhlokhi wedatha futhi zikhiphe umphumela. Ngaphakathi kukanxande, indima yawo ibonisiwe futhi uhlobo lwesihlungi lukhonjiswe ngosonhlamvukazi ngezansi nje. Imicibisholo exhuma onxande iwumugqa wedatha lapho amabhulokhi edatha alethwa khona ukusuka kusihlungi kuye kusihlungi. Ngokuvamile, isihlungi singaba nokokufaka okuningi nokuphumayo.

Konke kuqala ngomthombo wewashi, omisa i-tempo lapho idatha ibalwa khona ezihlungini. Ngokomjikelezo waso wewashi, isihlungi ngasinye sicubungula wonke amabhulokhi edatha akhona ngokokufaka kwaso. Futhi ibeka amabhlogo anomphumela emgqeni. Okokuqala, isihlungi esiseduze nomthombo wewashi senza izibalo, bese izihlungi zixhunywe emiphumeleni yaso (kungaba nemiphumela eminingi), njalonjalo. Ngemuva kokuthi isihlungi sokugcina ochungechungeni siqede ukucubungula, ukusebenzisa kuyama kuze kufike iwashi elisha. Amabhithi, ngokuzenzakalelayo, alandela isikhawu samamillisecond angu-10.

Masibuyele kumdwebo wethu. Imijikelezo yewashi ifika kokokufaka komthombo wokuthulisa; lesi isihlungi, esimatasa sikhiqiza ibhulokhi yedatha equkethe oziro ekuphumeni kwayo kumjikelezo wewashi ngamunye. Uma sibheka leli bhulokhi njengebhulokhi yamasampuli omsindo, lokhu akukhona okungaphezu kokuthula. Ekuboneni kokuqala, kubonakala kungavamile ukukhiqiza amabhlokhi wedatha ngokuthula - emva kwakho konke, angeke kuzwakale, kodwa la mabhulokhi ayadingeka ekusebenzeni kwejeneretha yesignali yomsindo. Ijeneretha isebenzisa la mabhuloki njengephepha elingenalutho, irekhoda amasampula omsindo kuwo. Esimeni sayo esijwayelekile, ijeneretha iyacishwa futhi ivele idlulisele amabhulokhi okokufaka kokuphumayo. Ngakho-ke, amabhlokhi okuthula adlula engashintshiwe kuwo wonke umjikelezo ukusuka kwesobunxele kuya kwesokudla, agcine ekhadini lomsindo. Okuthatha buthule amabhlogo kulayini oxhunywe kokokufaka kwawo.

Kodwa yonke into iyashintsha uma ijeneretha inikezwa umyalo wokudlala umsindo, iqala ukukhiqiza amasampula omsindo futhi iwafake esikhundleni samasampula kumabhulokhi wokufaka bese ibeka amabhlogo ashintshiwe ekuphumeni. Ikhadi lomsindo liqala ukudlala umsindo. Ngezansi uhlelo olusebenzisa isikimu somsebenzi esichazwe ngenhla:

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

Ngemuva kokuqaliswa kokusakaza kwemidiya, izihlungi ezintathu ziyadalwa: voidsource, dtmfgen, snd_card_write. Kudalwe umthombo wewashi.

Khona-ke udinga ukuxhuma izihlungi ngokuhambisana nesifunda sethu, futhi umthombo wewashi kufanele uxhunywe ekugcineni, kusukela ngemva kwalokhu isifunda sizoqala ukusebenza ngokushesha. Uma uxhuma umthombo wewashi kumjikelezo ongaqediwe, kungenzeka ukuthi isisakaza-midiya siphahlazeke uma sithola okungenani isihlungi esisodwa kuketango nakho konke okokufaka noma konke okuphumayo β€œokulenga emoyeni” (akuxhunyiwe).

Ukuxhuma izihlungi kwenziwa kusetshenziswa umsebenzi

ms_filter_link(src, src_out, dst, dst_in)

lapho i-agumenti yokuqala iyinkomba yesihlungi somthombo, i-agumenti yesibili inombolo yokuphuma komthombo (qaphela ukuthi okokufaka nokuphumayo kubalwa kusukela kuziro). I-agumenti yesithathu iyisikhombi kusihlungi somamukeli, eyesine inombolo yokufaka yomamukeli.

Zonke izihlungi zixhunyiwe futhi umthombo wewashi uxhumeke ekugcineni (ngemuva kwalokhu sizomane sikubize ngokuthi ithikha). Ngemva kwalokho isifunda sethu somsindo siqala ukusebenza, kodwa akukho lutho olungazwakala kuzipikha zekhompiyutha okwamanje - ijeneretha yomsindo ivaliwe futhi imane idlule kumabhulokhi wedatha yokufaka ngokuthula. Ukuze uqale ukukhiqiza ithoni, udinga ukusebenzisa indlela yokuhlunga i-generator.

Sizokhiqiza isignali yamathoni amabili (i-DTMF) ehambisana nokucindezela inkinobho ethi "1" ocingweni. Ukuze wenze lokhu, sisebenzisa umsebenzi ms_filter_call_method() Sibiza indlela ye-MS_DTMF_GEN_PLAY, siyidlulise njenge-agumenti njengesikhombi sekhodi okufanele isignali yokudlala ihambisane nayo.

Okusele ukuhlanganisa uhlelo:

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

Bese ugijima:

$ ./mstest2

Ngemva kokuqala uhlelo, uzozwa isignali yomsindo emfushane ehlanganisa amathoni amabili kusipika sekhompyutha.

Sakha futhi sethula isifunda sethu sokuqala somsindo. Sibonile ukuthi zingakha kanjani izimo zokuhlunga, ukuthi ungazixhuma kanjani nokuthi ungazishayela kanjani izindlela zazo. Yize sijabule ngempumelelo yethu yokuqala, sisadinga ukunaka iqiniso lokuthi uhlelo lwethu alukhululi inkumbulo eyabelwe ngaphambi kokuphuma. Kolandelayo isihloko sizofunda ukuzihlanza.

Source: www.habr.com

Engeza amazwana